You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by mu...@apache.org on 2023/06/08 15:15:21 UTC

[xalan-java] branch xalan-j_xslt3.0 updated: doing few improvements to, existing xslt 3.0 and xpath 3.1 implementation for xalanj. minor modifications to existing test cases, and adding few new working test cases.

This is an automated email from the ASF dual-hosted git repository.

mukulg pushed a commit to branch xalan-j_xslt3.0
in repository https://gitbox.apache.org/repos/asf/xalan-java.git


The following commit(s) were added to refs/heads/xalan-j_xslt3.0 by this push:
     new d3a4b1f2 doing few improvements to, existing xslt 3.0 and xpath 3.1 implementation for xalanj. minor modifications to existing test cases, and adding few new working test cases.
d3a4b1f2 is described below

commit d3a4b1f2bb9e1d642b9ff839994edf824dc70558
Author: Mukul Gandhi <ga...@gmail.com>
AuthorDate: Thu Jun 8 20:45:02 2023 +0530

    doing few improvements to, existing xslt 3.0 and xpath 3.1 implementation for xalanj. minor modifications to existing test cases, and adding few new working test cases.
---
 src/org/apache/xalan/templates/ElemForEach.java    | 16 +++++---
 src/org/apache/xalan/templates/ElemIf.java         | 44 ++++++++++++++++-----
 src/org/apache/xml/dtm/DTMManager.java             | 45 +++++++++++-----------
 src/org/apache/xpath/XPath.java                    |  1 -
 src/org/apache/xpath/XPathContext.java             | 38 ++++++++++++++++--
 src/org/apache/xpath/functions/FuncLast.java       | 10 +++--
 src/org/apache/xpath/functions/FuncPosition.java   | 14 +++++--
 src/org/apache/xpath/xs/types/XSDuration.java      |  5 +--
 tests/analyze_string/test12.xsl                    |  6 ++-
 tests/analyze_string/test13.xsl                    |  8 ++--
 tests/fn_tokenize/test9.xsl                        | 34 +++++++++-------
 tests/fn_unparsed_text/file_a1.txt                 |  8 ++++
 tests/fn_unparsed_text/gold/test4.out              |  7 ++++
 tests/fn_unparsed_text/test3.xsl                   | 21 ++++------
 tests/fn_unparsed_text/{test3.xsl => test4.xsl}    | 38 +++++++-----------
 .../apache/xalan/xpath3/FnUnparsedTextTests.java   | 10 +++++
 ...FnUnparsedTextTests.java => SequenceTests.java} | 30 +++++----------
 tests/org/apache/xalan/xslt3/AllXsl3Tests.java     |  3 +-
 tests/xsl_sequence/gold/test1.out                  | 12 ++++++
 tests/xsl_sequence/gold/test2.out                  |  6 +++
 .../test9.xsl => xsl_sequence/test1.xsl}           | 29 +++++---------
 tests/xsl_sequence/test1_a.xml                     |  2 +
 .../test9.xsl => xsl_sequence/test2.xsl}           | 33 +++++++---------
 23 files changed, 249 insertions(+), 171 deletions(-)

diff --git a/src/org/apache/xalan/templates/ElemForEach.java b/src/org/apache/xalan/templates/ElemForEach.java
index 663f867d..df4f3523 100644
--- a/src/org/apache/xalan/templates/ElemForEach.java
+++ b/src/org/apache/xalan/templates/ElemForEach.java
@@ -52,7 +52,6 @@ import org.apache.xpath.operations.Variable;
  * 
  * @xsl.usage advanced
  */
-
 /*
  * Implementation of the XSLT 3.0 xsl:for-each instruction.
  */
@@ -343,6 +342,7 @@ public class ElemForEach extends ElemTemplateElement implements ExpressionOwner
         XObject evalResult = ((Function)m_selectExpression).execute(xctxt);
         if (evalResult instanceof ResultSequence) {
             processResultSequence(transformer, xctxt, evalResult);
+            transformer.setXPathContext(xctxtOriginal);
             return;
         }                
     }
@@ -355,6 +355,7 @@ public class ElemForEach extends ElemTemplateElement implements ExpressionOwner
         XObject evalResult = ((Variable)m_selectExpression).execute(xctxt);
         if (evalResult instanceof ResultSequence) {
             processResultSequence(transformer, xctxt, evalResult);
+            transformer.setXPathContext(xctxtOriginal);
             return;
         }
     }
@@ -560,25 +561,28 @@ public class ElemForEach extends ElemTemplateElement implements ExpressionOwner
    }
    
    /*
-    * Process each of the XDM items in order, stored within a 'ResultSequence' 
-    * object, with the body of xsl:for-each element.
+    * Process each of the XDM items stored within a 'ResultSequence', 
+    * in order, and apply each XDM item to all the XSLT instructions
+    * mentioned within body of current xsl:for-each element.
     */
    private void processResultSequence(TransformerImpl transformer,
                                       XPathContext xctxt, XObject evalResult) 
-                                                              throws TransformerException {
-       
+                                                              throws TransformerException {       
        ResultSequence resultSeq = (ResultSequence)evalResult;
        List<XObject> resultSeqItems = resultSeq.getResultSequenceItems();
        
+       xctxt.setXPath3ContextSize(resultSeqItems.size());
+       
        for (int idx = 0; idx < resultSeqItems.size(); idx++) {
            XObject resultSeqItem = resultSeqItems.get(idx);
            xctxt.setXPath3ContextItem(resultSeqItem);
+           xctxt.setXPath3ContextPosition(idx + 1);
            
            for (ElemTemplateElement elemTemplateElem = this.m_firstChild; elemTemplateElem != null; 
                                                           elemTemplateElem = elemTemplateElem.m_nextSibling) {
               xctxt.setSAXLocator(elemTemplateElem);
               transformer.setCurrentElement(elemTemplateElem);
-              elemTemplateElem.execute(transformer);
+              elemTemplateElem.execute(transformer);              
            }
        }
    }
diff --git a/src/org/apache/xalan/templates/ElemIf.java b/src/org/apache/xalan/templates/ElemIf.java
index e4f1ae05..74b2226f 100644
--- a/src/org/apache/xalan/templates/ElemIf.java
+++ b/src/org/apache/xalan/templates/ElemIf.java
@@ -23,20 +23,21 @@ package org.apache.xalan.templates;
 import javax.xml.transform.TransformerException;
 
 import org.apache.xalan.transformer.TransformerImpl;
+import org.apache.xml.dtm.DTM;
+import org.apache.xml.dtm.DTMManager;
 import org.apache.xpath.XPath;
 import org.apache.xpath.XPathContext;
 import org.apache.xpath.objects.XObject;
 
 /**
- * Implement xsl:if.
- * <pre>
- * <!ELEMENT xsl:if %template;>
- * <!ATTLIST xsl:if
- *   test %expr; #REQUIRED
- *   %space-att;
- * >
- * </pre>
- * @see <a href="http://www.w3.org/TR/xslt#section-Conditional-Processing-with-xsl:if">XXX in XSLT Specification</a>
+ * The XSLT xsl:if element, is used to perform conditional processing,
+ * within an XSLT stylesheet.
+ * 
+ * <xsl:if
+        test = expression>
+       <!-- Content: sequence-constructor -->
+   </xsl:if>
+
  * @xsl.usage advanced
  */
 public class ElemIf extends ElemTemplateElement
@@ -157,9 +158,32 @@ public class ElemIf extends ElemTemplateElement
       //    transformer.getTraceManager().fireSelectedEvent(sourceNode, this,
       //            "endTest", m_test, test);
     }
-    else if (m_test.bool(xctxt, sourceNode, this))
+    /*else if (m_test.bool(xctxt, sourceNode, this))
     {
       transformer.executeChildTemplates(this, true);
+    }*/
+    else {
+        XObject xpath3ContextItem = xctxt.getXPath3ContextItem();        
+        if (xpath3ContextItem != null) {
+            XPathContext xctxtNew = new XPathContext(false);            
+            xctxtNew.setVarStack(xctxt.getVarStack());
+            
+            xctxtNew.setXPath3ContextPosition(xctxt.getXPath3ContextPosition());
+            xctxtNew.setXPath3ContextSize(xctxt.getXPath3ContextSize());
+                              
+            DTMManager dtmMgr = xctxtNew.getDTMManager();            
+            DTM docFragDtm = dtmMgr.createDTMForSimpleXMLDocument(xpath3ContextItem.str());
+      
+            int contextNode = docFragDtm.getFirstChild(docFragDtm.getDocument());            
+            xctxtNew.pushCurrentNode(contextNode);
+            xctxtNew.setSAXLocator(this);
+            if (m_test.bool(xctxtNew, contextNode, this)) {
+                transformer.executeChildTemplates(this, true);    
+            }  
+        }        
+        else if (m_test.bool(xctxt, sourceNode, this)) {
+           transformer.executeChildTemplates(this, true);
+        }
     }
     
   }
diff --git a/src/org/apache/xml/dtm/DTMManager.java b/src/org/apache/xml/dtm/DTMManager.java
index b8a149c9..4ad1169b 100644
--- a/src/org/apache/xml/dtm/DTMManager.java
+++ b/src/org/apache/xml/dtm/DTMManager.java
@@ -216,9 +216,8 @@ public abstract class DTMManager
   
   /*
    * This method constructs a DTM object representing an XML document. 
-   * The DTM instance that is constructed by this method, contains only 
-   * 'one xml element with a text node child'. This method currently 
-   * supports, evaluation of XSLT xsl:analyze-string instruction.
+   * The DTM object instance that is constructed by this method, contains 
+   * only 'one xml element having a text node child'.
    * 
    * @param strVal   string value of the text node, that shall be available
    *                 within this constructed DTM object.
@@ -227,29 +226,29 @@ public abstract class DTMManager
    *    
    */
   public DTM createDTMForSimpleXMLDocument(String strVal) {    
-        try {
-           DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+      try {
+         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
     
-           dbf.setNamespaceAware(true);
+         dbf.setNamespaceAware(true);
     
-           DocumentBuilder db = dbf.newDocumentBuilder();
-           Document doc = db.newDocument();
-           // we create a, temporary xml element name here. this xml 
-           // element name, is unlikely to be present within the xml 
-           // input document that is been transformed by an xslt 
-           // stylesheet.
-           long currentTimeMills = System.currentTimeMillis();
-           String elemNameSuffix = (Long.valueOf(currentTimeMills)).toString();
-           Element elem = doc.createElement("t0_" + elemNameSuffix);
-           Text textNode = doc.createTextNode(strVal);
-           elem.appendChild(textNode);
-           doc.appendChild(elem);
+         DocumentBuilder db = dbf.newDocumentBuilder();
+         Document doc = db.newDocument();
+         // we create a, temporary xml element name here. this xml 
+         // element name, is unlikely to be present within the xml 
+         // input document that is been transformed by an xslt 
+         // stylesheet.
+         long currentTimeMills = System.currentTimeMillis();
+         String elemNameSuffix = (Long.valueOf(currentTimeMills)).toString();
+         Element elem = doc.createElement("t0_" + elemNameSuffix);
+         Text textNode = doc.createTextNode(strVal);
+         elem.appendChild(textNode);
+         doc.appendChild(elem);
     
-           return getDTM(new DOMSource(doc), true, null, false, false);
-        }
-        catch (Exception ex) {
-           throw new DTMException(ex);
-        }
+         return getDTM(new DOMSource(doc), true, null, false, false);
+      }
+      catch (Exception ex) {
+         throw new DTMException(ex);
+      }
   }
 
   /**
diff --git a/src/org/apache/xpath/XPath.java b/src/org/apache/xpath/XPath.java
index 9a2b1b1e..ec3ac9e0 100644
--- a/src/org/apache/xpath/XPath.java
+++ b/src/org/apache/xpath/XPath.java
@@ -33,7 +33,6 @@ import org.apache.xml.utils.SAXSourceLocator;
 import org.apache.xpath.compiler.Compiler;
 import org.apache.xpath.compiler.FunctionTable;
 import org.apache.xpath.compiler.XPathParser;
-import org.apache.xpath.functions.Function;
 import org.apache.xpath.objects.XObject;
 import org.apache.xpath.res.XPATHErrorResources;
 
diff --git a/src/org/apache/xpath/XPathContext.java b/src/org/apache/xpath/XPathContext.java
index 2ca48c88..5ecccfc0 100644
--- a/src/org/apache/xpath/XPathContext.java
+++ b/src/org/apache/xpath/XPathContext.java
@@ -99,12 +99,28 @@ public class XPathContext extends DTMManager // implements ExpressionContext
    */
   private boolean m_isSecureProcessing = false;
   
-  // supporting XPath 3.1 context item, to be saved within current XPath context
+  /*
+   *  data value, representing the XPath 3.1's current 
+   *  evaluation context item.
+   */
   private XObject m_xpath3ContextItem = null;
   
   /*
-   * This field, can be used to store custom data (represented as a map object) 
-   * within the current XPath evaluation context.
+   *  data value, representing the XPath 3.1's current 
+   *  evaluation context position.
+   */
+  private int m_xpath3ContextPosition = -1;
+  
+  /*
+   *  data value, representing the XPath 3.1's current 
+   *  evaluation context size.
+   */
+  private int m_xpath3ContextSize = -1; 
+  
+  /*
+   * this data value, can be used to store custom data 
+   * (represented as a java.util.Map object) within the 
+   * current XPath evaluation context.
    */
   private Map<String, String> m_customDataMap = new HashMap<String, String>();
   
@@ -1384,6 +1400,22 @@ public class XPathContext extends DTMManager // implements ExpressionContext
      this.m_xpath3ContextItem = xpath3ContextItem;
  }
 
+ public int getXPath3ContextPosition() {
+    return m_xpath3ContextPosition;
+ }
+
+ public void setXPath3ContextPosition(int xpath3ContextPosition) {
+    this.m_xpath3ContextPosition = xpath3ContextPosition;
+ }
+
+ public int getXPath3ContextSize() {
+    return m_xpath3ContextSize;
+ }
+
+ public void setXPath3ContextSize(int xpath3ContextSize) {
+    this.m_xpath3ContextSize = xpath3ContextSize;
+ }
+
  public GregorianCalendar getCurrentDateTime() {
      if (m_currentDateTime == null) {
          m_currentDateTime = new GregorianCalendar(TimeZone.getDefault());
diff --git a/src/org/apache/xpath/functions/FuncLast.java b/src/org/apache/xpath/functions/FuncLast.java
index 7adecda0..bf3eb9ac 100644
--- a/src/org/apache/xpath/functions/FuncLast.java
+++ b/src/org/apache/xpath/functions/FuncLast.java
@@ -27,14 +27,14 @@ import org.apache.xpath.compiler.Compiler;
 import org.apache.xpath.objects.XNumber;
 import org.apache.xpath.objects.XObject;
 
-
 /**
- * Execute the Last() function.
+ * Execute the XPath 3.1 last() function.
+ * 
  * @xsl.usage advanced
  */
 public class FuncLast extends Function
 {
-    static final long serialVersionUID = 9205812403085432943L;
+  static final long serialVersionUID = 9205812403085432943L;
   
   private boolean m_isTopLevel;
   
@@ -59,6 +59,10 @@ public class FuncLast extends Function
   public int getCountOfContextNodeList(XPathContext xctxt)
           throws javax.xml.transform.TransformerException
   {
+      
+    if (xctxt.getXPath3ContextSize() != -1) {
+        return xctxt.getXPath3ContextSize();
+    }
 
     // assert(null != m_contextNodeList, "m_contextNodeList must be non-null");
     // If we're in a predicate, then this will return non-null.
diff --git a/src/org/apache/xpath/functions/FuncPosition.java b/src/org/apache/xpath/functions/FuncPosition.java
index be0402dd..b5e6f1a3 100644
--- a/src/org/apache/xpath/functions/FuncPosition.java
+++ b/src/org/apache/xpath/functions/FuncPosition.java
@@ -29,12 +29,14 @@ import org.apache.xpath.objects.XNumber;
 import org.apache.xpath.objects.XObject;
 
 /**
- * Execute the Position() function.
+ * Execute the XPath 3.1 position() function.
+ * 
  * @xsl.usage advanced
  */
 public class FuncPosition extends Function
 {
-    static final long serialVersionUID = -9092846348197271582L;
+  static final long serialVersionUID = -9092846348197271582L;
+  
   private boolean m_isTopLevel;
   
   /**
@@ -51,12 +53,16 @@ public class FuncPosition extends Function
    *
    * @param xctxt Runtime XPath context.
    *
-   * @return The current position of the itteration in the context node list, 
+   * @return The current position of the iteration in the context node list, 
    *         or -1 if there is no active context node list.
    */
   public int getPositionInContextNodeList(XPathContext xctxt)
   {
-
+    
+    if (xctxt.getXPath3ContextPosition() != -1) {
+       return xctxt.getXPath3ContextPosition();
+    }
+    
     // System.out.println("FuncPosition- entry");
     // If we're in a predicate, then this will return non-null.
     SubContextList iter = m_isTopLevel ? null : xctxt.getSubContextList();
diff --git a/src/org/apache/xpath/xs/types/XSDuration.java b/src/org/apache/xpath/xs/types/XSDuration.java
index d75ab56b..72be5b33 100644
--- a/src/org/apache/xpath/xs/types/XSDuration.java
+++ b/src/org/apache/xpath/xs/types/XSDuration.java
@@ -153,7 +153,6 @@ public class XSDuration extends XSCtrType {
 			didSomething = true;
 		}
 
-		// do the "time" bit
 		int hours = hours();
 		int minutes = minutes();
 		double seconds = seconds();
@@ -168,9 +167,7 @@ public class XSDuration extends XSCtrType {
 		}
 		if (seconds != 0) {
 			String doubStr = (new Double(seconds).toString());
-			if (doubStr.endsWith(".0")) {
-				// string value of x.0 seconds is xS. e.g, 7.0S is converted to
-				// 7S.
+			if (doubStr.endsWith(".0")) {				
 				tret += doubStr.substring(0, doubStr.indexOf(".0")) + "S";
 			} else {
 				tret += seconds + "S";
diff --git a/tests/analyze_string/test12.xsl b/tests/analyze_string/test12.xsl
index 3294cb2c..2f451386 100644
--- a/tests/analyze_string/test12.xsl
+++ b/tests/analyze_string/test12.xsl
@@ -5,7 +5,9 @@
    <!-- Author: mukulg@apache.org -->
    
    <!-- XSLT stylesheet to transform, date with string format '23 March 2002' 
-        to the string format '2002-03-23'. -->
+        to the string format '2002-03-23'.
+        Note the use of, double curly braces within xsl:analyze-string's regex,
+        because the regex attribute is an avt. -->
 
    <xsl:output method="text"/>
      
@@ -14,7 +16,7 @@
    <xsl:variable name="date1" select="'23 March 2002'"/>
 
    <xsl:template match="/">      
-      <xsl:analyze-string select="$date1" regex="([0-9]{{1,2}})\s([A-Z][a-z]+)\s([0-9]{{4}})">          
+      <xsl:analyze-string select="normalize-space($date1)" regex="([0-9]{{1,2}})\s([A-Z][a-z]+)\s([0-9]{{4}})">          
           <xsl:matching-substring>              
               <xsl:value-of select="regex-group(3)"/>
               <xsl:text>-</xsl:text>
diff --git a/tests/analyze_string/test13.xsl b/tests/analyze_string/test13.xsl
index 099292ac..f7f6214d 100644
--- a/tests/analyze_string/test13.xsl
+++ b/tests/analyze_string/test13.xsl
@@ -7,8 +7,10 @@
    <!-- use with test1_h.xml -->
    
    <!-- XSLT stylesheet to transform, date with string format '23 March 2002' 
-        to the string format '2002-03-23'. This stylesheet, transforms sequence 
-        of xml 'date' elements. -->
+        to the string format '2002-03-23'.
+        Note the use of, double curly braces within xsl:analyze-string's regex,
+        because the regex attribute is an avt.
+        This stylesheet, transforms sequence of xml 'date' elements. -->
 
    <xsl:output method="xml" indent="yes"/>
      
@@ -18,7 +20,7 @@
       <result>
          <xsl:for-each select="date">
              <date>      
-                 <xsl:analyze-string select="." regex="([0-9]{{1,2}})\s([A-Z][a-z]+)\s([0-9]{{4}})">          
+                 <xsl:analyze-string select="normalize-space(.)" regex="([0-9]{{1,2}})\s([A-Z][a-z]+)\s([0-9]{{4}})">          
                      <xsl:matching-substring>              
                          <xsl:value-of select="regex-group(3)"/>
                          <xsl:text>-</xsl:text>
diff --git a/tests/fn_tokenize/test9.xsl b/tests/fn_tokenize/test9.xsl
index b10859e7..103f2e9a 100644
--- a/tests/fn_tokenize/test9.xsl
+++ b/tests/fn_tokenize/test9.xsl
@@ -5,28 +5,36 @@
    <!-- Author: mukulg@apache.org -->                
    
    <!-- use with test1_b.xml -->
+   
+   <!-- this XSLT stylesheet, tests emitting specific items
+        from an XDM sequence to XSLT transformation's 
+        output. -->
 
    <xsl:output method="xml" indent="yes"/>
 
    <xsl:template match="/elem">
-      <elem>
-        <xsl:variable name="tokens">
-	   <xsl:for-each select="tokenize(str2, '\s+')">
-	     <item><xsl:value-of select="."/></item>
-	   </xsl:for-each>              
-        </xsl:variable>
-        <!-- emitting specific items from resulting sequence (please 
-             see the previous xsl:variable evaluation), using following 
-             xslt template instructions. -->
+      <elem>        
+        <xsl:variable name="tokens" select="tokenize(str2, '\s+')"/>
         <result1>
-           <xsl:copy-of select="$tokens/item[position() &lt; 5]"/>
+            <xsl:for-each select="$tokens">
+               <xsl:if test="position() &lt; 5">
+                  <item><xsl:value-of select="."/></item>
+               </xsl:if>
+            </xsl:for-each>
         </result1>
         <result2>
-	   <xsl:copy-of select="$tokens/item[2] | $tokens/item[3]"/>
+            <xsl:for-each select="$tokens">
+               <xsl:if test="(position() = 2) or (position() = 3)">
+                  <item><xsl:value-of select="."/></item>
+               </xsl:if>
+            </xsl:for-each>
         </result2>
         <result3>
-           <xsl:copy-of select="$tokens/item[(position() != 1) and 
-                                                 (position() != last())]"/>
+            <xsl:for-each select="$tokens">
+               <xsl:if test="(position() != 1) and (position() != last())">
+                  <item><xsl:value-of select="."/></item>
+               </xsl:if>
+            </xsl:for-each>
         </result3>
       </elem>
    </xsl:template>
diff --git a/tests/fn_unparsed_text/file_a1.txt b/tests/fn_unparsed_text/file_a1.txt
new file mode 100644
index 00000000..3a85c254
--- /dev/null
+++ b/tests/fn_unparsed_text/file_a1.txt
@@ -0,0 +1,8 @@
+hello world
+this is a test file that
+
+we'll use with an xslt transformation
+
+hello
+
+hi there
diff --git a/tests/fn_unparsed_text/gold/test4.out b/tests/fn_unparsed_text/gold/test4.out
new file mode 100644
index 00000000..2522c389
--- /dev/null
+++ b/tests/fn_unparsed_text/gold/test4.out
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?><result>
+  <line>hello world</line>
+  <line>this is a test file that</line>
+  <line>we'll use with an xslt transformation</line>
+  <line>hello</line>
+  <line>hi there</line>
+</result>
diff --git a/tests/fn_unparsed_text/test3.xsl b/tests/fn_unparsed_text/test3.xsl
index 989f2cbc..a968e4ca 100644
--- a/tests/fn_unparsed_text/test3.xsl
+++ b/tests/fn_unparsed_text/test3.xsl
@@ -14,20 +14,15 @@
           <title/>
         </head>
         <body>
-           <xsl:variable name="tokens">
-              <xsl:for-each select="tokenize($fileContents, '\r?\n')">
-                <token><xsl:value-of select="."/></token>
-              </xsl:for-each>
-           </xsl:variable>
-           <xsl:for-each select="$tokens/token">
+           <xsl:for-each select="tokenize($fileContents, '\r?\n')">
               <xsl:choose>
-	         <xsl:when test="position() &lt; last()">
-	            <b><xsl:value-of select="string(.)"/></b>
-	            <br/>
-	         </xsl:when>
-	         <xsl:otherwise>
-	            <b><xsl:value-of select="string(.)"/></b>
-	         </xsl:otherwise>
+	              <xsl:when test="position() &lt; last()">
+	                 <b><xsl:value-of select="."/></b>
+	                 <br/>
+	              </xsl:when>
+	              <xsl:otherwise>
+	                 <b><xsl:value-of select="."/></b>
+	              </xsl:otherwise>
                </xsl:choose>
            </xsl:for-each>
         </body>
diff --git a/tests/fn_unparsed_text/test3.xsl b/tests/fn_unparsed_text/test4.xsl
similarity index 56%
copy from tests/fn_unparsed_text/test3.xsl
copy to tests/fn_unparsed_text/test4.xsl
index 989f2cbc..dbd82e31 100644
--- a/tests/fn_unparsed_text/test3.xsl
+++ b/tests/fn_unparsed_text/test4.xsl
@@ -3,35 +3,23 @@
                 version="3.0">
                 
    <!-- Author: mukulg@apache.org -->
+   
+   <!-- using XPath 3.1 function fn:unparsed-text to read a text file,
+        and producing an XSLT transformation output that doesn't contain 
+        whitespace only or empty lines. -->                
 
-   <xsl:output method="html" indent="yes"/>
+   <xsl:output method="xml" indent="yes"/>
    
-   <xsl:variable name="fileContents" select="unparsed-text('test_1.txt')"/>
+   <xsl:variable name="fileLines" select="tokenize(unparsed-text('file_a1.txt'),'\r?\n')"/>
 
    <xsl:template match="/">
-     <html>
-        <head>
-          <title/>
-        </head>
-        <body>
-           <xsl:variable name="tokens">
-              <xsl:for-each select="tokenize($fileContents, '\r?\n')">
-                <token><xsl:value-of select="."/></token>
-              </xsl:for-each>
-           </xsl:variable>
-           <xsl:for-each select="$tokens/token">
-              <xsl:choose>
-	         <xsl:when test="position() &lt; last()">
-	            <b><xsl:value-of select="string(.)"/></b>
-	            <br/>
-	         </xsl:when>
-	         <xsl:otherwise>
-	            <b><xsl:value-of select="string(.)"/></b>
-	         </xsl:otherwise>
-               </xsl:choose>
-           </xsl:for-each>
-        </body>
-      </html>
+      <result>
+         <xsl:for-each select="$fileLines">
+            <xsl:if test="not(normalize-space() = '')">
+              <line><xsl:value-of select="."/></line>
+            </xsl:if>
+         </xsl:for-each>
+      </result>
    </xsl:template>
    
    <!--
diff --git a/tests/org/apache/xalan/xpath3/FnUnparsedTextTests.java b/tests/org/apache/xalan/xpath3/FnUnparsedTextTests.java
index ba1f369a..79fa68e1 100644
--- a/tests/org/apache/xalan/xpath3/FnUnparsedTextTests.java
+++ b/tests/org/apache/xalan/xpath3/FnUnparsedTextTests.java
@@ -76,5 +76,15 @@ public class FnUnparsedTextTests extends XslTransformTestsUtil {
         
         runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);   
     }
+    
+    @Test
+    public void xslFnUnparsedTextTest4() {
+        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test4.xsl"; 
+        String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test4.xsl";
+        
+        String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test4.out";
+        
+        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);   
+    }
 
 }
diff --git a/tests/org/apache/xalan/xpath3/FnUnparsedTextTests.java b/tests/org/apache/xalan/xpath3/SequenceTests.java
similarity index 73%
copy from tests/org/apache/xalan/xpath3/FnUnparsedTextTests.java
copy to tests/org/apache/xalan/xpath3/SequenceTests.java
index ba1f369a..56895112 100644
--- a/tests/org/apache/xalan/xpath3/FnUnparsedTextTests.java
+++ b/tests/org/apache/xalan/xpath3/SequenceTests.java
@@ -23,21 +23,21 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 
 /**
- * XPath 3.1 function fn:unparsed-text test cases.
+ * XSLT 3.0 test cases, to test traversal of XDM sequences.
  * 
  * @author Mukul Gandhi <mu...@apache.org>
  * 
  * @xsl.usage advanced
  */
-public class FnUnparsedTextTests extends XslTransformTestsUtil {
+public class SequenceTests extends XslTransformTestsUtil {
     
-    private static final String XSL_TRANSFORM_INPUT_DIRPATH = XSLConstants.XSL_TRANSFORM_INPUT_DIRPATH_PREFIX + "fn_unparsed_text/";
+    private static final String XSL_TRANSFORM_INPUT_DIRPATH = XSLConstants.XSL_TRANSFORM_INPUT_DIRPATH_PREFIX + "xsl_sequence/";
     
-    private static final String XSL_TRANSFORM_GOLD_DIRPATH = XSLConstants.XSL_TRANSFORM_GOLD_DIRPATH_PREFIX + "fn_unparsed_text/gold/";
+    private static final String XSL_TRANSFORM_GOLD_DIRPATH = XSLConstants.XSL_TRANSFORM_GOLD_DIRPATH_PREFIX + "xsl_sequence/gold/";
 
     @BeforeClass
     public static void setUpBeforeClass() throws Exception {
-        // no op 
+        // no op
     }
 
     @AfterClass
@@ -48,8 +48,8 @@ public class FnUnparsedTextTests extends XslTransformTestsUtil {
     }
 
     @Test
-    public void xslFnUnparsedTextTest1() {
-        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test1.xsl"; 
+    public void xslSequenceTest1() {
+        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test1_a.xml"; 
         String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test1.xsl";
         
         String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test1.out";                
@@ -58,23 +58,13 @@ public class FnUnparsedTextTests extends XslTransformTestsUtil {
     }
     
     @Test
-    public void xslFnUnparsedTextTest2() {
-        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test2.xsl"; 
+    public void xslSequenceTest2() {
+        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test1_a.xml"; 
         String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test2.xsl";
         
         String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test2.out";                
         
-        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);   
-    }
-    
-    @Test
-    public void xslFnUnparsedTextTest3() {
-        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test3.xsl"; 
-        String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test3.xsl";
-        
-        String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test3.out";
-        
-        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);   
+        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
     }
 
 }
diff --git a/tests/org/apache/xalan/xslt3/AllXsl3Tests.java b/tests/org/apache/xalan/xslt3/AllXsl3Tests.java
index 76506c68..6c68f421 100644
--- a/tests/org/apache/xalan/xslt3/AllXsl3Tests.java
+++ b/tests/org/apache/xalan/xslt3/AllXsl3Tests.java
@@ -21,6 +21,7 @@ import org.apache.xalan.xpath3.FnIndexOfTests;
 import org.apache.xalan.xpath3.FnStringJoinTests;
 import org.apache.xalan.xpath3.FnTokenizeTests;
 import org.apache.xalan.xpath3.FnUnparsedTextTests;
+import org.apache.xalan.xpath3.SequenceTests;
 import org.apache.xalan.xpath3.StringTests;
 import org.apache.xalan.xpath3.XsConstructorFunctions;
 import org.junit.runner.RunWith;
@@ -44,7 +45,7 @@ import org.junit.runners.Suite.SuiteClasses;
                 GroupingWithSortTests.class, RtfMigrationTests.class, QuantifiedExprTests.class, 
                 FnUnparsedTextTests.class, FnTokenizeTests.class, FnStringJoinTests.class,
                 FnAbsTests.class, StringTests.class, XsConstructorFunctions.class, 
-                FnIndexOfTests.class })
+                FnIndexOfTests.class, SequenceTests.class })
 public class AllXsl3Tests {
 
 }
diff --git a/tests/xsl_sequence/gold/test1.out b/tests/xsl_sequence/gold/test1.out
new file mode 100644
index 00000000..777cc36a
--- /dev/null
+++ b/tests/xsl_sequence/gold/test1.out
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?><elem>
+  <token>a</token>
+  <token>b</token>
+  <token>c</token>
+  <token>d</token>
+  <token>e</token>
+  <token>f</token>
+  <token>g</token>
+  <token>h</token>
+  <token>i</token>
+  <token>j</token>
+</elem>
diff --git a/tests/xsl_sequence/gold/test2.out b/tests/xsl_sequence/gold/test2.out
new file mode 100644
index 00000000..41cdb339
--- /dev/null
+++ b/tests/xsl_sequence/gold/test2.out
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?><elem>
+  <token>a</token>
+  <token>b</token>
+  <token>c</token>
+  <token>d</token>
+</elem>
diff --git a/tests/fn_tokenize/test9.xsl b/tests/xsl_sequence/test1.xsl
similarity index 57%
copy from tests/fn_tokenize/test9.xsl
copy to tests/xsl_sequence/test1.xsl
index b10859e7..b895e56e 100644
--- a/tests/fn_tokenize/test9.xsl
+++ b/tests/xsl_sequence/test1.xsl
@@ -2,32 +2,21 @@
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                 version="3.0">
                 
-   <!-- Author: mukulg@apache.org -->                
+   <!-- Author: mukulg@apache.org -->
    
-   <!-- use with test1_b.xml -->
+   <!-- use with test1_a.xml -->
+   
+   <!-- demonstrating, traversing an XDM sequence comprising of 
+        XPath 3.1 atomic values, using xsl:for-each instruction. -->
 
    <xsl:output method="xml" indent="yes"/>
 
    <xsl:template match="/elem">
       <elem>
-        <xsl:variable name="tokens">
-	   <xsl:for-each select="tokenize(str2, '\s+')">
-	     <item><xsl:value-of select="."/></item>
-	   </xsl:for-each>              
-        </xsl:variable>
-        <!-- emitting specific items from resulting sequence (please 
-             see the previous xsl:variable evaluation), using following 
-             xslt template instructions. -->
-        <result1>
-           <xsl:copy-of select="$tokens/item[position() &lt; 5]"/>
-        </result1>
-        <result2>
-	   <xsl:copy-of select="$tokens/item[2] | $tokens/item[3]"/>
-        </result2>
-        <result3>
-           <xsl:copy-of select="$tokens/item[(position() != 1) and 
-                                                 (position() != last())]"/>
-        </result3>
+        <xsl:variable name="tokens" select="tokenize(.,'\s+')"/>
+        <xsl:for-each select="$tokens">
+           <token><xsl:value-of select="."/></token>
+        </xsl:for-each>
       </elem>
    </xsl:template>
    
diff --git a/tests/xsl_sequence/test1_a.xml b/tests/xsl_sequence/test1_a.xml
new file mode 100644
index 00000000..0abfa59b
--- /dev/null
+++ b/tests/xsl_sequence/test1_a.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<elem>a b c d e f g h i j</elem>
\ No newline at end of file
diff --git a/tests/fn_tokenize/test9.xsl b/tests/xsl_sequence/test2.xsl
similarity index 57%
copy from tests/fn_tokenize/test9.xsl
copy to tests/xsl_sequence/test2.xsl
index b10859e7..21ba4956 100644
--- a/tests/fn_tokenize/test9.xsl
+++ b/tests/xsl_sequence/test2.xsl
@@ -2,32 +2,25 @@
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                 version="3.0">
                 
-   <!-- Author: mukulg@apache.org -->                
+   <!-- Author: mukulg@apache.org -->
    
-   <!-- use with test1_b.xml -->
+   <!-- use with test1_a.xml -->
+   
+   <!-- demonstrating, traversing an XDM sequence comprising of 
+        XPath 3.1 atomic values, using xsl:for-each instruction and 
+        using specific XDM items depending on their position within 
+        the sequence. -->
 
    <xsl:output method="xml" indent="yes"/>
 
    <xsl:template match="/elem">
       <elem>
-        <xsl:variable name="tokens">
-	   <xsl:for-each select="tokenize(str2, '\s+')">
-	     <item><xsl:value-of select="."/></item>
-	   </xsl:for-each>              
-        </xsl:variable>
-        <!-- emitting specific items from resulting sequence (please 
-             see the previous xsl:variable evaluation), using following 
-             xslt template instructions. -->
-        <result1>
-           <xsl:copy-of select="$tokens/item[position() &lt; 5]"/>
-        </result1>
-        <result2>
-	   <xsl:copy-of select="$tokens/item[2] | $tokens/item[3]"/>
-        </result2>
-        <result3>
-           <xsl:copy-of select="$tokens/item[(position() != 1) and 
-                                                 (position() != last())]"/>
-        </result3>
+        <xsl:variable name="tokens" select="tokenize(.,'\s+')"/>
+        <xsl:for-each select="$tokens">
+          <xsl:if test="position() &lt; 5">
+            <token><xsl:value-of select="."/></token>
+          </xsl:if>
+        </xsl:for-each>
       </elem>
    </xsl:template>
    


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xalan.apache.org
For additional commands, e-mail: commits-help@xalan.apache.org