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 2026/04/15 16:50:16 UTC

(xalan-java) branch xalan-j_xslt3.0_mvn updated: committing xalan-j xslt3.0 implementation improvements for stylesheet invocation using an initial xsl stylesheet function

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

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


The following commit(s) were added to refs/heads/xalan-j_xslt3.0_mvn by this push:
     new adc8b688f committing xalan-j xslt3.0 implementation improvements for stylesheet invocation using an initial xsl stylesheet function
adc8b688f is described below

commit adc8b688f6fe7c81616cbf4c94df9e1a158e3d74
Author: Mukul Gandhi <ga...@gmail.com>
AuthorDate: Wed Apr 15 22:20:02 2026 +0530

    committing xalan-j xslt3.0 implementation improvements for stylesheet invocation using an initial xsl stylesheet function
---
 README                                             |  6 +-
 .../org/apache/xalan/res/XSLTErrorResources.java   |  3 +-
 .../apache/xalan/transformer/TransformerImpl.java  | 31 +++++++---
 src/main/java/org/apache/xalan/xslt/Process.java   |  1 +
 .../xalan/tests/xslt3/XslInitialFunctionTests.java | 68 ++++++++++++++++++++++
 .../resources/xsl_initial_function/gold/test10.out |  1 +
 .../resources/xsl_initial_function/gold/test6.out  |  1 +
 .../resources/xsl_initial_function/gold/test7.out  |  1 +
 .../resources/xsl_initial_function/gold/test8.out  |  1 +
 .../resources/xsl_initial_function/gold/test9.out  |  1 +
 src/test/resources/xsl_initial_function/test1.xml  |  4 ++
 src/test/resources/xsl_initial_function/test10.xsl | 43 ++++++++++++++
 src/test/resources/xsl_initial_function/test6.xsl  | 37 ++++++++++++
 src/test/resources/xsl_initial_function/test7.xsl  | 37 ++++++++++++
 src/test/resources/xsl_initial_function/test8.xsl  | 37 ++++++++++++
 src/test/resources/xsl_initial_function/test9.xsl  | 43 ++++++++++++++
 16 files changed, 302 insertions(+), 13 deletions(-)

diff --git a/README b/README
index df268005f..a549225b7 100644
--- a/README
+++ b/README
@@ -98,16 +98,16 @@ When this Maven build command is run, results like following shall be produced:
 [INFO]  T E S T S
 [INFO] -------------------------------------------------------
 [INFO] Running org.apache.xalan.tests.main.XalanXsl3TestSuite2
-[INFO] Tests run: 531, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 17.777 s - in org.apache.xalan.tests.main.XalanXsl3TestSuite2
+[INFO] Tests run: 536, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 18.796 s - in org.apache.xalan.tests.main.XalanXsl3TestSuite2
 [INFO]
 [INFO] Results:
 [INFO]
-[INFO] Tests run: 531, Failures: 0, Errors: 0, Skipped: 0
+[INFO] Tests run: 536, Failures: 0, Errors: 0, Skipped: 0
 
 [INFO] ------------------------------------------------------------------------
 [INFO] BUILD SUCCESS
 [INFO] ------------------------------------------------------------------------
-[INFO] Total time:  47.006 s
+[INFO] Total time:  51.827 s
 
 4) This code base repos branch also has Xalan Java's XSLT 3.0 test drivers for W3C XSLT 3.0 test suite (located at, 
 https://github.com/w3c/xslt30-test).
diff --git a/src/main/java/org/apache/xalan/res/XSLTErrorResources.java b/src/main/java/org/apache/xalan/res/XSLTErrorResources.java
index d2104b71f..e99af641a 100644
--- a/src/main/java/org/apache/xalan/res/XSLTErrorResources.java
+++ b/src/main/java/org/apache/xalan/res/XSLTErrorResources.java
@@ -1379,9 +1379,10 @@ public class XSLTErrorResources extends ListResourceBundle
   { "optionXSL", "   [-XSL XSLTransformationURL]"},
   { "optionXSVAL", "   [-XSVAL (Request XML Schema validation of XML input document)]"},
   { "optionXSL_EVALUATE", "   [-XSL_EVALUATE (Request xsl:evaluate instruction to be enabled)]"},
-  { "optionINIT_TEMPLATE", "   [-INIT_TEMPLATE (Specify an XSL template's name to select an initial template for transformation)]"},
+  { "optionINIT_TEMPLATE", "   [-INIT_TEMPLATE (Specify an XSL template's name to select an initial template for stylesheet transformation)]"},
   { "optionINIT_MODE", "   [-INIT_MODE (Specify an XSL transformation's initial mode name)]"},
   { "optionENABLE_ASSERT", "   [-ENABLE_ASSERT value (Specify whether XSL assert is enabled. Value \"true\", \"yes\", \"1\" means enabled otherwise disabled)]"},
+  { "optionINIT_FUNCTION", "   [-INIT_FUNCTION (Specify an XSL function's name to select an initial function for stylesheet transformation)]"},
   { "optionENCODING", "   [-ENCODING (Specify value of encoding to be used for XML input and stylesheet documents. Use format utf_8 (default), iso_8859_1 etc.)]"},
   { "optionOUT",  "   [-OUT outputFileName]"},
   { "optionLXCIN", "   [-LXCIN compiledStylesheetFileNameIn]"},
diff --git a/src/main/java/org/apache/xalan/transformer/TransformerImpl.java b/src/main/java/org/apache/xalan/transformer/TransformerImpl.java
index 490842d4a..3528398a7 100644
--- a/src/main/java/org/apache/xalan/transformer/TransformerImpl.java
+++ b/src/main/java/org/apache/xalan/transformer/TransformerImpl.java
@@ -474,6 +474,12 @@ public class TransformerImpl extends Transformer implements Runnable, DTMWSFilte
   private List<String> m_enabledPropertyList = new ArrayList<String>(); 
   
   private List<ElemWithParam> m_xslWithParamList = new ArrayList<ElemWithParam>();
+  
+  /**
+   * Initial context node handle for XSL transformation, when
+   * XSL transformation is initiated via an XSL stylesheet function.
+   */
+  private int m_docNode = DTM.NULL;
 
   /**
    * NEEDSDOC Method setShouldReset 
@@ -899,11 +905,13 @@ public class TransformerImpl extends Transformer implements Runnable, DTMWSFilte
         }           
       }
       
-      DTM dtm = null;
+      DTM dtm = null;            
       
       if (source != null) {
         dtm = mgr.getDTM(source, false, this, true, true);
         dtm.setDocumentBaseURI(base);
+        
+        m_docNode = dtm.getDocument();
       }
       
       boolean hardDelete = true;  // %REVIEW% I have to think about this. -sb
@@ -2527,7 +2535,7 @@ public class TransformerImpl extends Transformer implements Runnable, DTMWSFilte
   public boolean applyTemplateToNode(ElemTemplateElement xslInstruction,  // xsl:apply-templates or xsl:for-each
                                      ElemTemplate template, int child)
                                              throws TransformerException
-  {
+  {	  	  
 
     DTM dtm = m_xcontext.getDTM(child);
     short nodeType = DTM.ROOT_NODE;
@@ -2678,14 +2686,16 @@ public class TransformerImpl extends Transformer implements Runnable, DTMWSFilte
              }                          
           }
           else if (initFunctionName != null) {
-        	 ElemFunction elemFunction = m_stylesheetRoot.getXslFunction(initFunctionName, 0);
-        	 ResultSequence argSequence = new ResultSequence();
-        	 XObject funcResult = elemFunction.evaluateXslFunction(this, argSequence);
-        	 ResultSequence seqForResult = new ResultSequence();
-        	 seqForResult.add(funcResult);
         	 try {
-				ElemCopyOf.copyOfActionOnResultSequence(seqForResult, this, m_serializationHandler, xctxt, false, template);
-			 } 
+        		 xctxt.pushCurrentNode(m_docNode);
+        		 
+        		 ElemFunction elemFunction = m_stylesheetRoot.getXslFunction(initFunctionName, 0);   // assuming function arity is 0 for now
+        		 ResultSequence argSequence = new ResultSequence();
+        		 XObject funcResult = elemFunction.evaluateXslFunction(this, argSequence);
+        		 ResultSequence seqForResult = new ResultSequence();
+        		 seqForResult.add(funcResult);
+        		 ElemCopyOf.copyOfActionOnResultSequence(seqForResult, this, m_serializationHandler, xctxt, false, template);
+        	 }
         	 catch (TransformerException ex) {
                 throw ex;
 			 } 
@@ -2694,6 +2704,9 @@ public class TransformerImpl extends Transformer implements Runnable, DTMWSFilte
                 SourceLocator srcLocator = xctxt.getSAXLocator();
                 throw new TransformerException(errMesg, srcLocator); 
 			 }
+        	 finally {
+        		xctxt.popCurrentNode(); 
+        	 }
         	 
         	 return true;
           }
diff --git a/src/main/java/org/apache/xalan/xslt/Process.java b/src/main/java/org/apache/xalan/xslt/Process.java
index 6908dc783..ef6d37696 100644
--- a/src/main/java/org/apache/xalan/xslt/Process.java
+++ b/src/main/java/org/apache/xalan/xslt/Process.java
@@ -94,6 +94,7 @@ public class Process
     System.out.println(resbundle.getString("optionINIT_TEMPLATE"));  //" [-INIT_TEMPLATE (Specify an XSL template's name to select an initial template for transformation)]");
     System.out.println(resbundle.getString("optionINIT_MODE"));  //" [-INIT_MODE (Specify an XSL transformation's initial mode name)]");
     System.out.println(resbundle.getString("optionENABLE_ASSERT"));  //" [-ENABLE_ASSERT (Specify whether XSL assert is enabled)]");
+    System.out.println(resbundle.getString("optionINIT_FUNCTION"));  //" [-INIT_FUNCTION (Specify an XSL template's name to select an initial template for transformation)]");
     System.out.println(resbundle.getString("optionENCODING"));  //" [-ENCODING (Specify value of encoding to be used for XML input and stylesheet documents. Use format utf_8 (default), iso_8859_1 etc.)]");
     System.out.println(resbundle.getString("optionOUT"));  //"   [-OUT outputFileName]");
 
diff --git a/src/test/java/org/apache/xalan/tests/xslt3/XslInitialFunctionTests.java b/src/test/java/org/apache/xalan/tests/xslt3/XslInitialFunctionTests.java
index 59709919a..ef532d3f4 100644
--- a/src/test/java/org/apache/xalan/tests/xslt3/XslInitialFunctionTests.java
+++ b/src/test/java/org/apache/xalan/tests/xslt3/XslInitialFunctionTests.java
@@ -109,5 +109,73 @@ public class XslInitialFunctionTests extends XslTransformTestsUtil {
         
         runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
     }
+    
+    @Test
+    public void xslInitialFunctionTest6() {
+        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test1.xml"; 
+        String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test6.xsl";
+        
+        String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test6.out";
+        
+        m_fileComparisonType = XSLTestConstants.TEXT;
+        
+        m_initFunctionName = "{http://fn0}func1";
+        
+        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
+    }
+    
+    @Test
+    public void xslInitialFunctionTest7() {
+        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test1.xml"; 
+        String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test7.xsl";
+        
+        String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test7.out";
+        
+        m_fileComparisonType = XSLTestConstants.TEXT;
+        
+        m_initFunctionName = "{http://fn0}func1";
+        
+        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
+    }
+    
+    @Test
+    public void xslInitialFunctionTest8() {
+        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test1.xml"; 
+        String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test8.xsl";
+        
+        String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test8.out";
+        
+        m_fileComparisonType = XSLTestConstants.TEXT;
+        
+        m_initFunctionName = "{http://fn0}func1";
+        
+        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
+    }
+    
+    @Test
+    public void xslInitialFunctionTest9() {
+        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test1.xml"; 
+        String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test9.xsl";
+        
+        String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test9.out";
+        
+        m_fileComparisonType = XSLTestConstants.TEXT;
+        
+        m_initFunctionName = "{http://fn0}func1";
+        
+        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
+    }
+    
+    @Test
+    public void xslInitialFunctionTest10() {
+        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test1.xml"; 
+        String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test10.xsl";
+        
+        String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test10.out";                
+        
+        m_initFunctionName = "{http://fn0}func1";
+        
+        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
+    }
 
 }
diff --git a/src/test/resources/xsl_initial_function/gold/test10.out b/src/test/resources/xsl_initial_function/gold/test10.out
new file mode 100644
index 000000000..7e9121772
--- /dev/null
+++ b/src/test/resources/xsl_initial_function/gold/test10.out
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8"?><result>1.414</result>
diff --git a/src/test/resources/xsl_initial_function/gold/test6.out b/src/test/resources/xsl_initial_function/gold/test6.out
new file mode 100644
index 000000000..b6fc4c620
--- /dev/null
+++ b/src/test/resources/xsl_initial_function/gold/test6.out
@@ -0,0 +1 @@
+hello
\ No newline at end of file
diff --git a/src/test/resources/xsl_initial_function/gold/test7.out b/src/test/resources/xsl_initial_function/gold/test7.out
new file mode 100644
index 000000000..95d09f2b1
--- /dev/null
+++ b/src/test/resources/xsl_initial_function/gold/test7.out
@@ -0,0 +1 @@
+hello world
\ No newline at end of file
diff --git a/src/test/resources/xsl_initial_function/gold/test8.out b/src/test/resources/xsl_initial_function/gold/test8.out
new file mode 100644
index 000000000..95d09f2b1
--- /dev/null
+++ b/src/test/resources/xsl_initial_function/gold/test8.out
@@ -0,0 +1 @@
+hello world
\ No newline at end of file
diff --git a/src/test/resources/xsl_initial_function/gold/test9.out b/src/test/resources/xsl_initial_function/gold/test9.out
new file mode 100644
index 000000000..0e03f6f24
--- /dev/null
+++ b/src/test/resources/xsl_initial_function/gold/test9.out
@@ -0,0 +1 @@
+hello 5
\ No newline at end of file
diff --git a/src/test/resources/xsl_initial_function/test1.xml b/src/test/resources/xsl_initial_function/test1.xml
new file mode 100644
index 000000000..3c59442ee
--- /dev/null
+++ b/src/test/resources/xsl_initial_function/test1.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<test1>
+   <message>hello</message>
+</test1>
\ No newline at end of file
diff --git a/src/test/resources/xsl_initial_function/test10.xsl b/src/test/resources/xsl_initial_function/test10.xsl
new file mode 100644
index 000000000..44a5dfdb1
--- /dev/null
+++ b/src/test/resources/xsl_initial_function/test10.xsl
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"				
+				xmlns:math="http://www.w3.org/2005/xpath-functions/math"
+				xmlns:fn0="http://fn0"
+				exclude-result-prefixes="#all" 
+				version="3.0">
+				
+    <!-- Author: mukulg@apache.org -->                
+   
+    <!-- An XSL 3 stylesheet test case, to test XSL transformation with 
+         an initial named function. -->					
+
+	<xsl:output method="xml" indent="yes"/>
+	
+	<xsl:variable name="doc1" select="/"/>
+
+	<xsl:function name="fn0:func1">
+	   <xsl:sequence>
+	      <result>
+             <xsl:value-of select="round(math:sqrt(2), 3)"/>
+	      </result>
+	   </xsl:sequence>
+	</xsl:function>
+	
+	<!--
+      * Licensed to the Apache Software Foundation (ASF) under one
+      * or more contributor license agreements. See the NOTICE file
+      * distributed with this work for additional information
+      * regarding copyright ownership. The ASF licenses this file
+      * to you under the Apache License, Version 2.0 (the "License");
+      * you may not use this file except in compliance with the License.
+      * You may obtain a copy of the License at
+      *
+      *     http://www.apache.org/licenses/LICENSE-2.0
+      *
+      * Unless required by applicable law or agreed to in writing, software
+      * distributed under the License is distributed on an "AS IS" BASIS,
+      * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      * See the License for the specific language governing permissions and
+      * limitations under the License.
+    -->
+
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/src/test/resources/xsl_initial_function/test6.xsl b/src/test/resources/xsl_initial_function/test6.xsl
new file mode 100644
index 000000000..e81386b96
--- /dev/null
+++ b/src/test/resources/xsl_initial_function/test6.xsl
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+				xmlns:fn0="http://fn0"
+				version="3.0">
+				
+    <!-- Author: mukulg@apache.org -->                
+   
+    <!-- An XSL 3 stylesheet test case, to test XSL transformation with 
+         an initial named function. -->					
+
+	<xsl:output method="text"/>
+	
+	<xsl:variable name="doc1" select="/"/>
+
+	<xsl:function name="fn0:func1">
+       <xsl:sequence select="$doc1/test1/message"/>
+	</xsl:function>
+	
+	<!--
+      * Licensed to the Apache Software Foundation (ASF) under one
+      * or more contributor license agreements. See the NOTICE file
+      * distributed with this work for additional information
+      * regarding copyright ownership. The ASF licenses this file
+      * to you under the Apache License, Version 2.0 (the "License");
+      * you may not use this file except in compliance with the License.
+      * You may obtain a copy of the License at
+      *
+      *     http://www.apache.org/licenses/LICENSE-2.0
+      *
+      * Unless required by applicable law or agreed to in writing, software
+      * distributed under the License is distributed on an "AS IS" BASIS,
+      * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      * See the License for the specific language governing permissions and
+      * limitations under the License.
+    -->
+
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/src/test/resources/xsl_initial_function/test7.xsl b/src/test/resources/xsl_initial_function/test7.xsl
new file mode 100644
index 000000000..282fca87f
--- /dev/null
+++ b/src/test/resources/xsl_initial_function/test7.xsl
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+				xmlns:fn0="http://fn0"
+				version="3.0">
+				
+    <!-- Author: mukulg@apache.org -->                
+   
+    <!-- An XSL 3 stylesheet test case, to test XSL transformation with 
+         an initial named function. -->					
+
+	<xsl:output method="text"/>
+	
+	<xsl:variable name="doc1" select="/"/>
+
+	<xsl:function name="fn0:func1">
+       <xsl:sequence select="$doc1/test1/message || ' world'"/>
+	</xsl:function>
+	
+	<!--
+      * Licensed to the Apache Software Foundation (ASF) under one
+      * or more contributor license agreements. See the NOTICE file
+      * distributed with this work for additional information
+      * regarding copyright ownership. The ASF licenses this file
+      * to you under the Apache License, Version 2.0 (the "License");
+      * you may not use this file except in compliance with the License.
+      * You may obtain a copy of the License at
+      *
+      *     http://www.apache.org/licenses/LICENSE-2.0
+      *
+      * Unless required by applicable law or agreed to in writing, software
+      * distributed under the License is distributed on an "AS IS" BASIS,
+      * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      * See the License for the specific language governing permissions and
+      * limitations under the License.
+    -->
+
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/src/test/resources/xsl_initial_function/test8.xsl b/src/test/resources/xsl_initial_function/test8.xsl
new file mode 100644
index 000000000..446de68df
--- /dev/null
+++ b/src/test/resources/xsl_initial_function/test8.xsl
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+				xmlns:fn0="http://fn0"
+				version="3.0">
+				
+    <!-- Author: mukulg@apache.org -->                
+   
+    <!-- An XSL 3 stylesheet test case, to test XSL transformation with 
+         an initial named function. -->					
+
+	<xsl:output method="text"/>
+	
+	<xsl:variable name="doc1" select="/"/>
+
+	<xsl:function name="fn0:func1">
+       <xsl:sequence select="concat($doc1/test1/message, ' world')"/>
+	</xsl:function>
+	
+	<!--
+      * Licensed to the Apache Software Foundation (ASF) under one
+      * or more contributor license agreements. See the NOTICE file
+      * distributed with this work for additional information
+      * regarding copyright ownership. The ASF licenses this file
+      * to you under the Apache License, Version 2.0 (the "License");
+      * you may not use this file except in compliance with the License.
+      * You may obtain a copy of the License at
+      *
+      *     http://www.apache.org/licenses/LICENSE-2.0
+      *
+      * Unless required by applicable law or agreed to in writing, software
+      * distributed under the License is distributed on an "AS IS" BASIS,
+      * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      * See the License for the specific language governing permissions and
+      * limitations under the License.
+    -->
+
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/src/test/resources/xsl_initial_function/test9.xsl b/src/test/resources/xsl_initial_function/test9.xsl
new file mode 100644
index 000000000..40753af5d
--- /dev/null
+++ b/src/test/resources/xsl_initial_function/test9.xsl
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+				xmlns:xs="http://www.w3.org/2001/XMLSchema"
+				xmlns:fn0="http://fn0"
+				version="3.0">
+				
+    <!-- Author: mukulg@apache.org -->                
+   
+    <!-- An XSL 3 stylesheet test case, to test XSL transformation with 
+         an initial named function. -->					
+
+	<xsl:output method="text"/>
+	
+	<xsl:variable name="doc1" select="/"/>
+
+	<xsl:function name="fn0:func1">
+       <xsl:sequence select="concat($doc1/test1/message, ' ', fn0:length($doc1/test1/message))"/>
+	</xsl:function>
+	
+	<xsl:function name="fn0:length" as="xs:integer">
+	   <xsl:param name="str" as="xs:string"/>
+	   <xsl:sequence select="string-length($str)"/>
+	</xsl:function>
+	
+	<!--
+      * Licensed to the Apache Software Foundation (ASF) under one
+      * or more contributor license agreements. See the NOTICE file
+      * distributed with this work for additional information
+      * regarding copyright ownership. The ASF licenses this file
+      * to you under the Apache License, Version 2.0 (the "License");
+      * you may not use this file except in compliance with the License.
+      * You may obtain a copy of the License at
+      *
+      *     http://www.apache.org/licenses/LICENSE-2.0
+      *
+      * Unless required by applicable law or agreed to in writing, software
+      * distributed under the License is distributed on an "AS IS" BASIS,
+      * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      * See the License for the specific language governing permissions and
+      * limitations under the License.
+    -->
+
+</xsl:stylesheet>
\ No newline at end of file


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