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 2025/08/27 11:58:39 UTC
(xalan-java) branch xalan-j_xslt3.0_mvn updated: committing few xalan-j xslt 3.0 code improvements
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 f450c3b31 committing few xalan-j xslt 3.0 code improvements
f450c3b31 is described below
commit f450c3b316a022049ee475662e4ca2cc1754efd4
Author: Mukul Gandhi <ga...@gmail.com>
AuthorDate: Wed Aug 27 17:28:04 2025 +0530
committing few xalan-j xslt 3.0 code improvements
---
.../apache/xalan/processor/XSLTAttributeDef.java | 4 +-
.../org/apache/xalan/templates/ElemFunction.java | 33 +++--
.../org/apache/xalan/templates/ElemSequence.java | 21 +++
.../org/apache/xalan/templates/ElemValueOf.java | 141 +++++++++++++++++++--
.../org/apache/xalan/templates/ElemVariable.java | 112 ++++++++++++++--
.../java/org/apache/xalan/transformer/MsgMgr.java | 6 +-
src/main/java/org/apache/xalan/xslt/Process.java | 8 +-
.../org/apache/xalan/xslt/util/StringUtil.java | 121 ++++++++++++++++++
.../xslt/util/XslTransformEvaluationHelper.java | 105 ---------------
.../xpath/axes/FilterExprIteratorSimple.java | 2 +-
.../org/apache/xpath/axes/LocPathIterator.java | 1 -
.../org/apache/xpath/compiler/XPathParser.java | 62 +++++----
.../org/apache/xpath/composite/XPathLetExpr.java | 13 +-
.../xpath/composite/XPathSequenceConstructor.java | 34 ++++-
.../java/org/apache/xpath/functions/FuncDoc.java | 3 +-
.../apache/xpath/functions/FuncFunctionArity.java | 38 +++++-
.../apache/xpath/functions/FuncFunctionName.java | 39 +++++-
.../apache/xpath/functions/FuncUnparsedText.java | 3 +-
.../apache/xpath/functions/json/FuncJsonDoc.java | 3 +-
.../w3c/xslt3/result/attr/_as-test-set_result.xml | 2 +-
.../w3c/xslt3/result/attr/_avt-test-set_result.xml | 2 +-
.../result/attr/_expand-text-test-set_result.xml | 2 +-
.../xslt3/result/attr/_match-test-set_result.xml | 2 +-
.../xslt3/result/attr/_select-test-set_result.xml | 2 +-
.../_xpath-default-namespace-test-set_result.xml | 2 +-
.../result/decl/_attribute-set-test-set_result.xml | 2 +-
.../result/decl/_character-map-test-set_result.xml | 2 +-
.../result/decl/_function-test-set_result.xml | 2 +-
.../result/decl/_variable-test-set_result.xml | 2 +-
.../xslt3/result/expr/_axes-test-set_result.xml | 2 +-
.../result/expr/_castable-test-set_result.xml | 2 +-
.../result/expr/_expression-test-set_result.xml | 2 +-
.../w3c/xslt3/result/expr/_for-test-set_result.xml | 2 +-
.../_higher-order-functions-test-set_result.xml | 10 +-
.../xslt3/result/expr/_math-test-set_result.xml | 2 +-
.../result/expr/_nodetest-test-set_result.xml | 2 +-
.../xslt3/result/expr/_path-test-set_result.xml | 2 +-
.../result/expr/_predicate-test-set_result.xml | 2 +-
.../result/fn/_deep-equal-test-set_result.xml | 2 +-
.../result/fn/_format-number-test-set_result.xml | 2 +-
.../result/fn/_json-to-xml-test-set_result.xml | 2 +-
.../w3c/xslt3/result/fn/_key-test-set_result.xml | 2 +-
.../xslt3/result/fn/_position-test-set_result.xml | 2 +-
.../w3c/xslt3/result/fn/_root-test-set_result.xml | 2 +-
.../insn/_analyze-string-test-set_result.xml | 2 +-
.../insn/_apply-templates-test-set_result.xml | 2 +-
.../result/insn/_attribute-test-set_result.xml | 2 +-
.../result/insn/_call-template-test-set_result.xml | 2 +-
.../xslt3/result/insn/_choose-test-set_result.xml | 2 +-
.../xslt3/result/insn/_copy-test-set_result.xml | 2 +-
.../xslt3/result/insn/_element-test-set_result.xml | 2 +-
.../insn/_for-each-group-test-set_result.xml | 2 +-
.../xslt3/result/insn/_iterate-test-set_result.xml | 2 +-
.../result/insn/_sequence-test-set_result.xml | 2 +-
.../xslt3/result/insn/_sort-test-set_result.xml | 2 +-
.../w3c/xslt3/result/insn/_try-test-set_result.xml | 2 +-
.../result/insn/_xsl-document-test-set_result.xml | 6 +-
.../xslt3/result/misc/_regex-test-set_result.xml | 2 +-
.../xslt3/result/type/_boolean-test-set_result.xml | 2 +-
.../xslt3/result/type/_date-test-set_result.xml | 2 +-
.../xslt3/result/type/_node-test-set_result.xml | 2 +-
.../xslt3/result/type/_string-test-set_result.xml | 2 +-
.../result/w3c_xslt3_testsuite_xalan-j_result.xml | 4 +-
src/test/resources/fn_json_doc/test3.xsl | 13 +-
src/test/resources/fn_parse_json/test12.xsl | 13 +-
.../resources/xsl_higher_order_functions/test9.xsl | 4 +-
66 files changed, 626 insertions(+), 255 deletions(-)
diff --git a/src/main/java/org/apache/xalan/processor/XSLTAttributeDef.java b/src/main/java/org/apache/xalan/processor/XSLTAttributeDef.java
index 050a225cb..fd6c396a1 100644
--- a/src/main/java/org/apache/xalan/processor/XSLTAttributeDef.java
+++ b/src/main/java/org/apache/xalan/processor/XSLTAttributeDef.java
@@ -35,7 +35,7 @@ import org.apache.xalan.templates.AVT;
import org.apache.xalan.templates.Constants;
import org.apache.xalan.templates.ElemForEachGroup;
import org.apache.xalan.templates.ElemTemplateElement;
-import org.apache.xalan.xslt.util.XslTransformEvaluationHelper;
+import org.apache.xalan.xslt.util.StringUtil;
import org.apache.xml.utils.NamespaceSupport2;
import org.apache.xml.utils.QName;
import org.apache.xml.utils.StringToIntTable;
@@ -1839,7 +1839,7 @@ public class XSLTAttributeDef
}
}
- if (!XslTransformEvaluationHelper.isStrHasBalancedParentheses(result, '(', ')')) {
+ if (!StringUtil.isStrHasBalancedParentheses(result, '(', ')')) {
throw new TransformerException("An xsl:for-each-group instruction's group-by value \"" +
groupByStrValue + "\" doesn't have or evaluates to a string "
+ "having balanced parenthesis pairs '(' and ')'.");
diff --git a/src/main/java/org/apache/xalan/templates/ElemFunction.java b/src/main/java/org/apache/xalan/templates/ElemFunction.java
index 4064c3562..6c2027626 100644
--- a/src/main/java/org/apache/xalan/templates/ElemFunction.java
+++ b/src/main/java/org/apache/xalan/templates/ElemFunction.java
@@ -17,6 +17,7 @@
*/
package org.apache.xalan.templates;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
@@ -28,8 +29,8 @@ import javax.xml.transform.SourceLocator;
import javax.xml.transform.TransformerException;
import org.apache.xalan.transformer.TransformerImpl;
-import org.apache.xalan.xslt.util.XslTransformEvaluationHelper;
import org.apache.xalan.xslt.util.XslTransformData;
+import org.apache.xalan.xslt.util.XslTransformEvaluationHelper;
import org.apache.xerces.xs.XSTypeDefinition;
import org.apache.xml.dtm.DTMCursorIterator;
import org.apache.xml.dtm.ref.DTMNodeList;
@@ -488,7 +489,7 @@ public class ElemFunction extends ElemTemplate
String funcAsAttrStrVal = getAs();
if (funcAsAttrStrVal != null) {
- // Process xsl:function's evaluation result with "as" attribute
+ // Process xsl:function's evaluation result with "as" attribute
try {
SequenceTypeData seqExpectedTypeData = SequenceTypeSupport.getSequenceTypeDataFromSeqTypeStr(funcAsAttrStrVal, xctxt, srcLocator);
@@ -534,8 +535,7 @@ public class ElemFunction extends ElemTemplate
funcAsAttrStrVal + ".", srcLocator);
}
}
- else if (((XslTransformData.m_xpathNamedFunctionRefSequence).size() > 0) &&
- !ElemVariable.m_isXPathNamedFunctionRefSequenceVar) {
+ else if (((XslTransformData.m_xpathNamedFunctionRefSequence).size() > 0) && !ElemVariable.m_isXPathNamedFunctionRefSequenceVar) {
int funcItemSeqSize = (XslTransformData.m_xpathNamedFunctionRefSequence).size();
SequenceTypeFunctionTest sequenceTypeFunctionTest = seqExpectedTypeData.getSequenceTypeFunctionTest();
@@ -591,16 +591,12 @@ public class ElemFunction extends ElemTemplate
", doesn't match the declared function result type " + funcAsAttrStrVal +
". The function arity specification doesn't match.", srcLocator);
}
- }
- else {
- // REVISIT
- }
+ }
}
(XslTransformData.m_xpathNamedFunctionRefSequence).remove(0);
}
else {
- // REVISIT
funcResultConvertedVal = XslTransformData.m_xpathNamedFunctionRefSequence;
(XslTransformData.m_xpathNamedFunctionRefSequence).clear();
}
@@ -631,6 +627,9 @@ public class ElemFunction extends ElemTemplate
catch (TransformerException ex) {
throw new TransformerException(ex.getMessage(), srcLocator);
}
+ finally {
+ ElemVariable.m_isXPathNamedFunctionRefSequenceVar = false;
+ }
}
if (funcResultConvertedVal instanceof ResultSequence) {
@@ -1206,5 +1205,21 @@ public class ElemFunction extends ElemTemplate
public boolean isOverrideExtensionFunctionAttrDeclared() {
return m_override_extension_function_attr_declared;
}
+
+ /**
+ * Method definition, to get xsl:function's parameter information.
+ *
+ * @return List of ElemParam objects, or null.
+ */
+ public List<ElemParam> getFuncParamList() {
+ List<ElemParam> funcParamList = new ArrayList<ElemParam>();
+
+ ElemTemplateElement elemTemplateElem = this.getFirstChildElem();
+ if (elemTemplateElem instanceof ElemParam) {
+ funcParamList.add((ElemParam)elemTemplateElem);
+ }
+
+ return funcParamList;
+ }
}
diff --git a/src/main/java/org/apache/xalan/templates/ElemSequence.java b/src/main/java/org/apache/xalan/templates/ElemSequence.java
index ef9dba609..90c58c1f4 100644
--- a/src/main/java/org/apache/xalan/templates/ElemSequence.java
+++ b/src/main/java/org/apache/xalan/templates/ElemSequence.java
@@ -352,6 +352,27 @@ public class ElemSequence extends ElemTemplateElement
return;
}
}
+ else if (xObjTemp instanceof ResultSequence) {
+ ResultSequence rSeq = (ResultSequence)xObjTemp;
+ boolList = new ArrayList<Boolean>();
+ for (int idx = 0; idx < rSeq.size(); idx++) {
+ XObject xObj = rSeq.item(idx);
+ if (xObj instanceof XPathNamedFunctionReference) {
+ boolList.add(Boolean.valueOf(true));
+ }
+ }
+
+ if (boolList.size() == rSeq.size()) {
+ for (int idx = 0; idx < rSeq.size(); idx++) {
+ XObject xObj = rSeq.item(idx);
+ (XslTransformData.m_xpathNamedFunctionRefSequence).add((XPathNamedFunctionReference)xObj);
+ }
+ }
+
+ if ((XslTransformData.m_xpathNamedFunctionRefSequence).size() > 0) {
+ return;
+ }
+ }
}
else if (selectExpression instanceof XPathArrayConstructor) {
XPathArrayConstructor xpathArrayCons = (XPathArrayConstructor)selectExpression;
diff --git a/src/main/java/org/apache/xalan/templates/ElemValueOf.java b/src/main/java/org/apache/xalan/templates/ElemValueOf.java
index bcff61247..74f7223b8 100644
--- a/src/main/java/org/apache/xalan/templates/ElemValueOf.java
+++ b/src/main/java/org/apache/xalan/templates/ElemValueOf.java
@@ -24,8 +24,8 @@ import javax.xml.transform.SourceLocator;
import javax.xml.transform.TransformerException;
import org.apache.xalan.transformer.TransformerImpl;
-import org.apache.xalan.xslt.util.XslTransformEvaluationHelper;
import org.apache.xalan.xslt.util.XslTransformData;
+import org.apache.xalan.xslt.util.XslTransformEvaluationHelper;
import org.apache.xml.dtm.DTM;
import org.apache.xml.dtm.DTMCursorIterator;
import org.apache.xml.dtm.DTMManager;
@@ -36,6 +36,7 @@ import org.apache.xpath.XPathContext;
import org.apache.xpath.axes.LocPathIterator;
import org.apache.xpath.composite.XPathIfExpr;
import org.apache.xpath.composite.XPathLetExpr;
+import org.apache.xpath.composite.XPathNamedFunctionReference;
import org.apache.xpath.functions.FuncRound;
import org.apache.xpath.functions.Function;
import org.apache.xpath.functions.WrongNumberArgsException;
@@ -619,15 +620,16 @@ public class ElemValueOf extends ElemTemplateElement {
Function func = locPathIterator.getFuncExpr();
XPathDynamicFunctionCall dfc = locPathIterator.getDynamicFuncCallExpr();
- DTMCursorIterator dtmIter = null;
+ DTMCursorIterator dtmIter = null;
+ boolean isLocPathIterOk = true;
try {
dtmIter = locPathIterator.asIterator(xctxt, current);
}
catch (Exception ex) {
- // NO OP
- }
+ isLocPathIterOk = false;
+ }
- if (dtmIter != null) {
+ if ((dtmIter != null) && isLocPathIterOk) {
StringBuffer strBuff = new StringBuffer();
int nextNode;
while ((nextNode = dtmIter.nextNode()) != DTM.NULL)
@@ -663,10 +665,13 @@ public class ElemValueOf extends ElemTemplateElement {
String xpathPatternStr = m_selectExpression.getPatternString();
if (xpathPatternStr.startsWith("$") && xpathPatternStr.contains("[") &&
- xpathPatternStr.endsWith("]")) {
- // Within this 'if' clause, we handle the case, where the XPath expression is
- // syntactically of type $varName[expr], for example $varName[1], $varName[$idx],
- // $varName[funcCall(arg)] etc, and $varName resolves to a 'ResultSequence' object.
+ xpathPatternStr.endsWith("]") &&
+ !(xpathPatternStr.contains("(") || xpathPatternStr.contains(")"))) {
+ /**
+ * Here, we handle the case where the XPath expression is of type $varName[expr],
+ * for example $varName[1], $varName[$idx], $varName[funcCall(arg)] etc, and
+ * $varName resolves to a 'ResultSequence' object.
+ */
String varRefXPathExprStr = "$" + xpathPatternStr.substring(1, xpathPatternStr.indexOf('['));
String xpathIndexExprStr = xpathPatternStr.substring(xpathPatternStr.indexOf('[') + 1,
@@ -744,6 +749,124 @@ public class ElemValueOf extends ElemTemplateElement {
}
}
}
+ else if (xpathPatternStr.startsWith("$")) {
+ /**
+ * Evaluating an XPath expression like $varRef[a](b,..)[c]. A typical
+ * example is, an XPath expression $varRef[a] is a 'function item'
+ * reference that is provided arguments (b,..). The function call
+ * result of, expression $varRef[a](b,..) is filtered with index
+ * accessor [c].
+ */
+
+ int idx = xpathPatternStr.indexOf('[');
+ if (idx > -1) {
+ String prefix1 = xpathPatternStr.substring(0, idx);
+ String suffix1 = null;
+ if (idx > 0) {
+ suffix1 = xpathPatternStr.substring(idx);
+ }
+
+ ElemTemplateElement elemTemplateElement = (ElemTemplateElement)xctxt.getNamespaceContext();
+ List<XMLNSDecl> prefixTable = null;
+ if (elemTemplateElement != null) {
+ prefixTable = (List<XMLNSDecl>)elemTemplateElement.getPrefixTable();
+ }
+
+ if (prefixTable != null) {
+ prefix1 = XslTransformEvaluationHelper.replaceNsUrisWithPrefixesOnXPathStr(prefix1, prefixTable);
+ }
+
+ XPath xpathObj = new XPath(prefix1, srcLocator, xctxt.getNamespaceContext(), XPath.SELECT, null);
+ if (m_vars != null) {
+ xpathObj.fixupVariables(m_vars, m_globals_size);
+ }
+
+ XObject prefixEvalResult = xpathObj.execute(xctxt, xctxt.getCurrentNode(), xctxt.getNamespaceContext());
+ if (prefixEvalResult instanceof XPathNamedFunctionReference) {
+ XPathNamedFunctionReference xpathNamedFunctionReference = (XPathNamedFunctionReference)prefixEvalResult;
+ ResultSequence rSeq = new ResultSequence();
+ rSeq.add(xpathNamedFunctionReference);
+ prefixEvalResult = rSeq;
+ }
+
+ try {
+ if (prefixEvalResult instanceof ResultSequence) {
+ ResultSequence rSeq = (ResultSequence)prefixEvalResult;
+ int i = suffix1.indexOf('(');
+ int j = suffix1.indexOf(')');
+ String a1 = null;
+ String[] b1 = null;
+ String c1 = null;
+ if ((i > -1) && (j > -1) && (i < j)) {
+ String str1 = suffix1.substring(0, i);
+ if (str1.startsWith("[") && str1.endsWith("]")) {
+ int strLen1 = str1.length();
+ a1 = str1.substring(1, strLen1 - 1);
+ }
+
+ String str2 = suffix1.substring(i + 1, j);
+ b1 = str2.split(",");
+ String str3 = suffix1.substring(j + 1);
+ if (str3.startsWith("[") && str3.endsWith("]")) {
+ int strLen3 = str3.length();
+ c1 = str3.substring(1, strLen3 - 1);
+ }
+ }
+
+ XPath xpath = new XPath(a1, srcLocator, xctxt.getNamespaceContext(), XPath.SELECT, null);
+ if (m_vars != null) {
+ xpath.fixupVariables(m_vars, m_globals_size);
+ }
+
+ XObject aXObj = xpath.execute(xctxt, xctxt.getCurrentNode(), xctxt.getNamespaceContext());
+ Integer aInt = Integer.valueOf(XslTransformEvaluationHelper.getStrVal(aXObj));
+ XObject xObj = rSeq.item(aInt - 1);
+
+ if ((xObj != null) && (xObj instanceof XPathNamedFunctionReference)) {
+ XPathNamedFunctionReference xpathNamedFunctionReference = (XPathNamedFunctionReference)xObj;
+ ElemFunction elemFunction = xpathNamedFunctionReference.getXslStylesheetFunction();
+ if (elemFunction != null) {
+ int argCount = b1.length;
+ if (elemFunction.getArity() == argCount) {
+ ResultSequence argResultSeq = new ResultSequence();
+ for (int idx2 = 0; idx2 < argCount; idx2++) {
+ XPath argXpathObj = new XPath(b1[idx2], srcLocator, xctxt.getNamespaceContext(), XPath.SELECT, null);
+ if (m_vars != null) {
+ argXpathObj.fixupVariables(m_vars, m_globals_size);
+ }
+
+ XObject argXObj = argXpathObj.execute(xctxt, xctxt.getCurrentNode(), xctxt.getNamespaceContext());
+ argResultSeq.add(argXObj);
+ }
+
+ XObject xslFuncEvalResult = elemFunction.evaluateXslFunction(transformer, argResultSeq);
+ if (xslFuncEvalResult instanceof ResultSequence) {
+ ResultSequence rSeq2 = (ResultSequence)xslFuncEvalResult;
+ xpath = new XPath(c1, srcLocator, xctxt.getNamespaceContext(), XPath.SELECT, null);
+ if (m_vars != null) {
+ xpath.fixupVariables(m_vars, m_globals_size);
+ }
+
+ XObject cXObj = xpath.execute(xctxt, xctxt.getCurrentNode(), xctxt.getNamespaceContext());
+ Integer cInt = Integer.valueOf(XslTransformEvaluationHelper.getStrVal(cXObj));
+ if (cInt > 0) {
+ xslFuncEvalResult = rSeq2.item(cInt - 1);
+ }
+ }
+
+ String strValue = XslTransformEvaluationHelper.getStrVal(xslFuncEvalResult);
+
+ (new XString(strValue)).dispatchCharactersEvents(rth);
+ }
+ }
+ }
+ }
+ }
+ catch (Exception ex) {
+ // NO OP
+ }
+ }
+ }
}
}
else if (expr instanceof XPathLetExpr) {
diff --git a/src/main/java/org/apache/xalan/templates/ElemVariable.java b/src/main/java/org/apache/xalan/templates/ElemVariable.java
index 9bf200778..4f3ae4369 100644
--- a/src/main/java/org/apache/xalan/templates/ElemVariable.java
+++ b/src/main/java/org/apache/xalan/templates/ElemVariable.java
@@ -26,8 +26,8 @@ import javax.xml.transform.TransformerException;
import org.apache.xalan.res.XSLTErrorResources;
import org.apache.xalan.transformer.TransformerImpl;
-import org.apache.xalan.xslt.util.XslTransformEvaluationHelper;
import org.apache.xalan.xslt.util.XslTransformData;
+import org.apache.xalan.xslt.util.XslTransformEvaluationHelper;
import org.apache.xml.dtm.DTM;
import org.apache.xml.dtm.DTMCursorIterator;
import org.apache.xml.utils.PrefixResolver;
@@ -950,18 +950,112 @@ public class ElemVariable extends ElemTemplateElement
}
if (!isSeqCardinalityOk) {
- throw new TransformerException("XTTE0505 : The variable " + m_qname.getLocalName() + "'s value doesn't conform to XPath sequence "
- + "type's occurence indicator, implying that an XDM value's "
- + "cardinality found as " + funcItemSeqSize + " is incorrect. "
- + "The sequence type has been specified as " + m_asAttr + ".", srcLocator);
+ throw new TransformerException("XTTE0505 : An xsl:variable " + m_qname.getLocalName() + "'s value doesn't conform to XPath sequence "
+ + "type's occurence indicator, implying that an xdm value's "
+ + "cardinality found as " + funcItemSeqSize + " is incorrect. "
+ + "The sequence type has been specified as " + m_asAttr + ".", srcLocator);
}
- if ((sequenceTypeFunctionTest != null) && sequenceTypeFunctionTest.isAnyFunctionTest()) {
- if ((XslTransformData.m_xpathNamedFunctionRefSequence).size() == 1) {
- var = (XslTransformData.m_xpathNamedFunctionRefSequence).item(0);
+ if (sequenceTypeFunctionTest != null) {
+ int funcRefCount = (XslTransformData.m_xpathNamedFunctionRefSequence).size();
+ if (sequenceTypeFunctionTest.isAnyFunctionTest()) {
+ if (funcRefCount == 1) {
+ var = (XslTransformData.m_xpathNamedFunctionRefSequence).item(0);
+ }
+ else {
+ var = XslTransformData.m_xpathNamedFunctionRefSequence;
+ }
}
else {
- var = XslTransformData.m_xpathNamedFunctionRefSequence;
+ List<String> funcParamSpecList = sequenceTypeFunctionTest.getTypedFunctionTestParamSpecList();
+ String funcReturnTypeSpec = sequenceTypeFunctionTest.getTypedFunctionTestReturnType();
+
+ List<XMLNSDecl> prefixTable = (List<XMLNSDecl>)this.getPrefixTable();
+
+ for (int idx = 0; idx < funcRefCount; idx++) {
+ XPathNamedFunctionReference funcRef1 = (XPathNamedFunctionReference)((XslTransformData.m_xpathNamedFunctionRefSequence).item(idx));
+ ElemFunction elemFunction = funcRef1.getXslStylesheetFunction();
+ if (elemFunction != null) {
+ int xpathNamedFuncRefArity = funcRef1.getArity();
+ int funcTypeSpecArity = funcParamSpecList.size();
+ if (xpathNamedFuncRefArity == funcTypeSpecArity) {
+ List<ElemParam> elemFuncParamList = elemFunction.getFuncParamList();
+ for (int i = 0; i < elemFuncParamList.size(); i++) {
+ boolean ok1 = false;
+ for (int j = 0; j < funcParamSpecList.size(); j++) {
+ if (i == j) {
+ ElemParam elemParam1 = elemFuncParamList.get(i);
+ String paramSpec1 = funcParamSpecList.get(j);
+ String elemParamAs = elemParam1.getAs();
+ if (elemParamAs == null) {
+ ok1 = true;
+ break;
+ }
+ else {
+ // Check equality of data type objects, corresponding to
+ // paramSpec1 and elemParamAs at the same positional index.
+
+ elemParamAs = XslTransformEvaluationHelper.replaceNsUrisWithPrefixesOnXPathStr(elemParamAs, prefixTable);
+ XPath seqTypeXPath1 = new XPath(elemParamAs, srcLocator, xctxt.getNamespaceContext(), XPath.SELECT, null, true);
+ XObject seqTypeExpressionEvalResult1 = seqTypeXPath1.execute(xctxt, xctxt.getContextNode(), xctxt.getNamespaceContext());
+ SequenceTypeData seqExpectedTypeData1 = (SequenceTypeData)seqTypeExpressionEvalResult1;
+
+ paramSpec1 = XslTransformEvaluationHelper.replaceNsUrisWithPrefixesOnXPathStr(paramSpec1, prefixTable);
+ XPath seqTypeXPath2 = new XPath(paramSpec1, srcLocator, xctxt.getNamespaceContext(), XPath.SELECT, null, true);
+ XObject seqTypeExpressionEvalResult2 = seqTypeXPath2.execute(xctxt, xctxt.getContextNode(), xctxt.getNamespaceContext());
+ SequenceTypeData seqExpectedTypeData2 = (SequenceTypeData)seqTypeExpressionEvalResult2;
+
+ if (!seqExpectedTypeData1.equal(seqExpectedTypeData2)) {
+ throw new TransformerException("XPTY0004 : An xsl:variable " + m_qname.getLocalName() + "'s value doesn't conform to "
+ + "xsl:variable's type specification " + m_asAttr + ". The "
+ + "function parameter specifications doesn't match.", srcLocator);
+ }
+ }
+ }
+ }
+
+ if (ok1) {
+ continue;
+ }
+ }
+ }
+ else {
+ throw new TransformerException("XPTY0004 : An xsl:variable " + m_qname.getLocalName() + "'s value doesn't conform to "
+ + "xsl:variable's type specification " + m_asAttr + ". The "
+ + "function arities doesn't match.", srcLocator);
+ }
+
+ String elemFuncAs = elemFunction.getAs();
+ if ((elemFuncAs != null) && (funcReturnTypeSpec != null)) {
+ elemFuncAs = XslTransformEvaluationHelper.replaceNsUrisWithPrefixesOnXPathStr(elemFuncAs, prefixTable);
+ XPath seqTypeXPath1 = new XPath(elemFuncAs, srcLocator, xctxt.getNamespaceContext(), XPath.SELECT, null, true);
+ XObject seqTypeExpressionEvalResult1 = seqTypeXPath1.execute(xctxt, xctxt.getContextNode(), xctxt.getNamespaceContext());
+ SequenceTypeData seqExpectedTypeData1 = (SequenceTypeData)seqTypeExpressionEvalResult1;
+
+ funcReturnTypeSpec = XslTransformEvaluationHelper.replaceNsUrisWithPrefixesOnXPathStr(funcReturnTypeSpec, prefixTable);
+ XPath seqTypeXPath2 = new XPath(funcReturnTypeSpec, srcLocator, xctxt.getNamespaceContext(), XPath.SELECT, null, true);
+ XObject seqTypeExpressionEvalResult2 = seqTypeXPath2.execute(xctxt, xctxt.getContextNode(), xctxt.getNamespaceContext());
+ SequenceTypeData seqExpectedTypeData2 = (SequenceTypeData)seqTypeExpressionEvalResult2;
+
+ if (!seqExpectedTypeData1.equal(seqExpectedTypeData2)) {
+ throw new TransformerException("XPTY0004 : An xsl:variable " + m_qname.getLocalName() + "'s value doesn't conform to "
+ + "xsl:variable's type specification " + m_asAttr + ". The "
+ + "function return types doesn't match.", srcLocator);
+ }
+ }
+ }
+ else {
+ // REVISIT To possibly handle other types of function references,
+ // that XPathNamedFunctionReference represents.
+ }
+ }
+
+ if (funcRefCount == 1) {
+ var = (XslTransformData.m_xpathNamedFunctionRefSequence).item(0);
+ }
+ else {
+ var = XslTransformData.m_xpathNamedFunctionRefSequence;
+ }
}
m_isXPathNamedFunctionRefSequenceVar = true;
diff --git a/src/main/java/org/apache/xalan/transformer/MsgMgr.java b/src/main/java/org/apache/xalan/transformer/MsgMgr.java
index c09d6759e..e7681c61d 100644
--- a/src/main/java/org/apache/xalan/transformer/MsgMgr.java
+++ b/src/main/java/org/apache/xalan/transformer/MsgMgr.java
@@ -299,11 +299,7 @@ public class MsgMgr
{
String formattedMsg = XSLMessages.createMessage(msg, args);
-
- // Locator locator = m_stylesheetLocatorStack.isEmpty()
- // ? null :
- // ((Locator)m_stylesheetLocatorStack.peek());
- // Locator locator = null;
+
ErrorListener errHandler = m_transformer.getErrorListener();
if (null != errHandler)
diff --git a/src/main/java/org/apache/xalan/xslt/Process.java b/src/main/java/org/apache/xalan/xslt/Process.java
index 5b3c63f93..f4a1abe46 100644
--- a/src/main/java/org/apache/xalan/xslt/Process.java
+++ b/src/main/java/org/apache/xalan/xslt/Process.java
@@ -213,7 +213,7 @@ public class Process
try
{
tfactory = TransformerFactory.newInstance();
- tfactory.setErrorListener(new DefaultErrorHandler(false));
+ tfactory.setErrorListener(new DefaultErrorHandler(true));
}
catch (TransformerFactoryConfigurationError err)
{
@@ -829,7 +829,7 @@ public class Process
((TransformerImpl)transformer).setProperty(TransformerImpl.XSL_EVALUATE_PROPERTY, Boolean.TRUE);
}
- transformer.setErrorListener(new DefaultErrorHandler(false));
+ transformer.setErrorListener(new DefaultErrorHandler(true));
// Override the output format?
if (null != outputType)
@@ -907,7 +907,7 @@ public class Process
// Now serialize output to disk with identity transformer
Transformer identityTransformer = stf.newTransformer();
- identityTransformer.setErrorListener(new DefaultErrorHandler(false));
+ identityTransformer.setErrorListener(new DefaultErrorHandler(true));
Properties serializationProps = stylesheet.getOutputProperties();
@@ -941,7 +941,7 @@ public class Process
// Now serialize output to disk with identity transformer
Transformer identityTransformer = stf.newTransformer();
- identityTransformer.setErrorListener(new DefaultErrorHandler(false));
+ identityTransformer.setErrorListener(new DefaultErrorHandler(true));
Properties serializationProps = stylesheet.getOutputProperties();
diff --git a/src/main/java/org/apache/xalan/xslt/util/StringUtil.java b/src/main/java/org/apache/xalan/xslt/util/StringUtil.java
new file mode 100644
index 000000000..b9c96b1ca
--- /dev/null
+++ b/src/main/java/org/apache/xalan/xslt/util/StringUtil.java
@@ -0,0 +1,121 @@
+package org.apache.xalan.xslt.util;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.Stack;
+
+/**
+ * A class definition, defining few utility methods for
+ * string information handling.
+ *
+ * @author Mukul Gandhi <mu...@apache.org>
+ *
+ * @xsl.usage general
+ */
+public class StringUtil {
+
+ /**
+ * Method definition to check, whether the supplied string value
+ * has balanced parentheses pairs.
+ */
+ public static boolean isStrHasBalancedParentheses(String strValue, char lParenChar, char rParenChar) {
+
+ boolean result = true;
+
+ Stack<Character> charStack = new Stack<Character>();
+
+ int strLen = strValue.length();
+
+ for(int idx = 0; idx < strLen; idx++) {
+ char ch = strValue.charAt(idx);
+ if (ch == lParenChar) {
+ charStack.push(ch);
+ }
+ else if (ch == rParenChar){
+ if (charStack.isEmpty() || (charStack.pop() != lParenChar)) {
+ // Unbalanced parentheses
+ result = false;
+ break;
+ }
+ }
+ }
+
+ if (!charStack.isEmpty()) {
+ result = false;
+ }
+
+ return result;
+ }
+
+ /**
+ * Method definition to check, whether the supplied string value
+ * has balanced XPath comment delimiters. XPath comments have
+ * lexical form (: comment text :)
+ */
+ public static boolean isStrHasBalancedXPathCommentDelim(String strValue) {
+
+ boolean result = true;
+
+ // Sufficiently random character strings, that're unlikely
+ // to occur within an XPath expression.
+ String lDelimStr = new String(new int[] { 2 }, 0, 1);
+ String rDelimStr = new String(new int[] { 3 }, 0, 1);
+
+ char lDelimChar = lDelimStr.charAt(0);
+ char rDelimChar = rDelimStr.charAt(0);
+
+ strValue = strValue.replace("(:", lDelimStr);
+ strValue = strValue.replace(":)", rDelimStr);
+
+ Stack<Character> charStack = new Stack<Character>();
+
+ int strLen = strValue.length();
+
+ for(int idx = 0; idx < strLen; idx++) {
+ char ch = strValue.charAt(idx);
+ if (ch == lDelimChar) {
+ charStack.push(ch);
+ }
+ else if (ch == rDelimChar){
+ if (charStack.isEmpty() || (charStack.pop() != lDelimChar)) {
+ // Unbalanced comment string
+ result = false;
+ break;
+ }
+ }
+ }
+
+ if (!charStack.isEmpty()) {
+ result = false;
+ }
+
+ return result;
+ }
+
+ /**
+ * Method definition, to get the string contents from a URL
+ * resource.
+ */
+ public static String getStringContentFromUrl(URL url) throws IOException {
+
+ StringBuilder strBuilder = new StringBuilder();
+
+ InputStream inpStream = url.openStream();
+ try {
+ BufferedReader buffReader = new BufferedReader(new InputStreamReader(inpStream));
+ int c;
+ while ((c = buffReader.read()) != -1) {
+ strBuilder.append((char)c);
+ }
+ }
+ finally {
+ inpStream.close();
+ }
+
+ return strBuilder.toString();
+ }
+
+}
diff --git a/src/main/java/org/apache/xalan/xslt/util/XslTransformEvaluationHelper.java b/src/main/java/org/apache/xalan/xslt/util/XslTransformEvaluationHelper.java
index b0f279ed7..72bfd1855 100644
--- a/src/main/java/org/apache/xalan/xslt/util/XslTransformEvaluationHelper.java
+++ b/src/main/java/org/apache/xalan/xslt/util/XslTransformEvaluationHelper.java
@@ -16,17 +16,11 @@
*/
package org.apache.xalan.xslt.util;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.Stack;
import java.util.stream.IntStream;
import javax.xml.transform.SourceLocator;
@@ -558,27 +552,6 @@ public class XslTransformEvaluationHelper {
return resultStr;
}
- /**
- * Get the string contents from an URL.
- */
- public static String getStringContentFromUrl(URL url) throws IOException {
- StringBuilder strBuilder = new StringBuilder();
-
- InputStream inpStream = url.openStream();
- try {
- BufferedReader buffReader = new BufferedReader(new InputStreamReader(inpStream));
- int c;
- while ((c = buffReader.read()) != -1) {
- strBuilder.append((char)c);
- }
- }
- finally {
- inpStream.close();
- }
-
- return strBuilder.toString();
- }
-
/**
* This method checks whether, an XSL xsl:with-param/xsl:param
* tunnel attribute's value is true (i.e, having string
@@ -594,84 +567,6 @@ public class XslTransformEvaluationHelper {
return result;
}
- /**
- * Method definition to check, whether the supplied string value
- * has balanced parentheses pairs.
- */
- public static boolean isStrHasBalancedParentheses(String strValue, char lParenChar, char rParenChar) {
-
- boolean result = true;
-
- Stack<Character> charStack = new Stack<Character>();
-
- int strLen = strValue.length();
-
- for(int idx = 0; idx < strLen; idx++) {
- char ch = strValue.charAt(idx);
- if (ch == lParenChar) {
- charStack.push(ch);
- }
- else if (ch == rParenChar){
- if (charStack.isEmpty() || (charStack.pop() != lParenChar)) {
- // Unbalanced parentheses
- result = false;
- break;
- }
- }
- }
-
- if (!charStack.isEmpty()) {
- result = false;
- }
-
- return result;
- }
-
- /**
- * Method definition to check, whether the supplied string value
- * has balanced XPath comment delimiters. XPath comments have
- * lexical form (: comment text :)
- */
- public static boolean isStrHasBalancedXPathCommentDelim(String strValue) {
-
- boolean result = true;
-
- // Sufficiently random character strings, that're unlikely
- // to occur within an XPath expression.
- String lDelimStr = new String(new int[] { 2 }, 0, 1);
- String rDelimStr = new String(new int[] { 3 }, 0, 1);
-
- char lDelimChar = lDelimStr.charAt(0);
- char rDelimChar = rDelimStr.charAt(0);
-
- strValue = strValue.replace("(:", lDelimStr);
- strValue = strValue.replace(":)", rDelimStr);
-
- Stack<Character> charStack = new Stack<Character>();
-
- int strLen = strValue.length();
-
- for(int idx = 0; idx < strLen; idx++) {
- char ch = strValue.charAt(idx);
- if (ch == lDelimChar) {
- charStack.push(ch);
- }
- else if (ch == rDelimChar){
- if (charStack.isEmpty() || (charStack.pop() != lDelimChar)) {
- // Unbalanced comment string
- result = false;
- break;
- }
- }
- }
-
- if (!charStack.isEmpty()) {
- result = false;
- }
-
- return result;
- }
-
/**
* Method definition to check whether, all the values of the
* supplied input sequence are XPath atomic values.
diff --git a/src/main/java/org/apache/xpath/axes/FilterExprIteratorSimple.java b/src/main/java/org/apache/xpath/axes/FilterExprIteratorSimple.java
index f122f1309..01add4df0 100644
--- a/src/main/java/org/apache/xpath/axes/FilterExprIteratorSimple.java
+++ b/src/main/java/org/apache/xpath/axes/FilterExprIteratorSimple.java
@@ -161,7 +161,7 @@ public class FilterExprIteratorSimple extends LocPathIterator
result = new XMLNodeCursorImpl(nodeHandleList, dtmMgr);
}
else {
- obj1 = exprEvalResult.object();
+ obj1 = exprEvalResult.object();
}
if (result == null) {
diff --git a/src/main/java/org/apache/xpath/axes/LocPathIterator.java b/src/main/java/org/apache/xpath/axes/LocPathIterator.java
index cd607715e..e301495e1 100644
--- a/src/main/java/org/apache/xpath/axes/LocPathIterator.java
+++ b/src/main/java/org/apache/xpath/axes/LocPathIterator.java
@@ -285,7 +285,6 @@ public abstract class LocPathIterator extends PredicatedNodeTest
throws javax.xml.transform.TransformerException
{
XMLNodeCursorImpl iter = new XMLNodeCursorImpl((LocPathIterator)m_clones.getInstance());
-
iter.setRoot(contextNode, xctxt);
return iter;
diff --git a/src/main/java/org/apache/xpath/compiler/XPathParser.java b/src/main/java/org/apache/xpath/compiler/XPathParser.java
index a27bb8765..ccd8d78b9 100644
--- a/src/main/java/org/apache/xpath/compiler/XPathParser.java
+++ b/src/main/java/org/apache/xpath/compiler/XPathParser.java
@@ -61,8 +61,8 @@ import org.apache.xalan.templates.ElemValueOf;
import org.apache.xalan.templates.ElemVariable;
import org.apache.xalan.templates.ElemWhen;
import org.apache.xalan.templates.StylesheetRoot;
+import org.apache.xalan.xslt.util.StringUtil;
import org.apache.xalan.xslt.util.XslTransformData;
-import org.apache.xalan.xslt.util.XslTransformEvaluationHelper;
import org.apache.xerces.dom.DOMInputImpl;
import org.apache.xerces.impl.xs.XSLoaderImpl;
import org.apache.xerces.xs.XSModel;
@@ -310,6 +310,8 @@ public class XPathParser
private String m_xpathDefaultNamespace = null;
+ private boolean m_op_group_parse = false;
+
/**
* The parser constructor.
@@ -362,7 +364,7 @@ public class XPathParser
// Remove XPath expression comments from the supplied expression,
// before parse of an XPath expression.
- if (XslTransformEvaluationHelper.isStrHasBalancedXPathCommentDelim(expression)) {
+ if (StringUtil.isStrHasBalancedXPathCommentDelim(expression)) {
expression = expression.replaceAll("\\(:.*:\\)", "");
}
else {
@@ -397,7 +399,7 @@ public class XPathParser
boolean isXPathExprStrHasBalancedParens = true;
for (int idx = 0; idx < strArr.length; idx++) {
String str1 = strArr[idx];
- if (!XslTransformEvaluationHelper.isStrHasBalancedParentheses(str1, '(', ')')) {
+ if (!StringUtil.isStrHasBalancedParentheses(str1, '(', ')')) {
isXPathExprStrHasBalancedParens = false;
}
}
@@ -1097,7 +1099,7 @@ public class XPathParser
else {
String argDetailsAccumulatedStrSoFar = "(" + getStrValueFromStrList(
argDetailsStrPartsList) + ")";
- if (!XslTransformEvaluationHelper.isStrHasBalancedParentheses(argDetailsAccumulatedStrSoFar, '(', ')')) {
+ if (!StringUtil.isStrHasBalancedParentheses(argDetailsAccumulatedStrSoFar, '(', ')')) {
argDetailsStrPartsList.add(m_token);
nextToken();
isXpathDynamicFuncCallParseAhead = true;
@@ -1564,7 +1566,7 @@ public class XPathParser
StringBuffer arrStrBuff = new StringBuffer();
arrStrBuff.append(m_token);
nextToken();
- while (!((tokenIs(',') && XslTransformEvaluationHelper.isStrHasBalancedParentheses(arrStrBuff.toString(), '[',']')) ||
+ while (!((tokenIs(',') && StringUtil.isStrHasBalancedParentheses(arrStrBuff.toString(), '[',']')) ||
(isSequenceConstructor && tokenIs(')')) ||
(isSquareArrayConstructor && tokenIs(']')) ||
(m_token == null))) {
@@ -1700,7 +1702,7 @@ public class XPathParser
rParenChar = '}';
}
- boolean isStrHasBalancedParentheses = XslTransformEvaluationHelper.isStrHasBalancedParentheses(
+ boolean isStrHasBalancedParentheses = StringUtil.isStrHasBalancedParentheses(
seqOrArrayMemberXPathExprStr,
lParenChar, rParenChar);
if (!isStrHasBalancedParentheses) {
@@ -2401,7 +2403,7 @@ public class XPathParser
strBuff.append(strList.get(idx));
}
- if (XslTransformEvaluationHelper.isStrHasBalancedParentheses(strBuff.toString(), '(', ')')) {
+ if (StringUtil.isStrHasBalancedParentheses(strBuff.toString(), '(', ')')) {
result = true;
}
}
@@ -2709,7 +2711,7 @@ public class XPathParser
else if (tokenIs(',') && (",".equals(prevTokenStrBeforeFor) || "(".equals(prevTokenStrBeforeFor))) {
String lstStrJoin = xPathReturnExprStrPartsList.toString();
lstStrJoin = lstStrJoin.substring(1, lstStrJoin.length()-1);
- if (XslTransformEvaluationHelper.isStrHasBalancedParentheses(lstStrJoin, '(', ')')) {
+ if (StringUtil.isStrHasBalancedParentheses(lstStrJoin, '(', ')')) {
break;
}
else {
@@ -2990,7 +2992,7 @@ public class XPathParser
String probableBranchConditionExprStr = probableBranchConditionXPathStrBuff.toString();
int thenTokenComputedRevisedIdx = 0;
- while (!XslTransformEvaluationHelper.isStrHasBalancedParentheses(probableBranchConditionExprStr, '(', ')')) {
+ while (!StringUtil.isStrHasBalancedParentheses(probableBranchConditionExprStr, '(', ')')) {
boolean isBreak = false;
for (int idx = (thenTokenEffectiveComputedIdx + 1); idx < tokenQueueSize; idx++) {
Object tokenObj = (m_ops.m_tokenQueue).elementAt(idx);
@@ -2998,7 +3000,7 @@ public class XPathParser
if (!"then".equals(tokenStrValue)) {
probableBranchConditionExprStr += tokenStrValue;
}
- else if (XslTransformEvaluationHelper.isStrHasBalancedParentheses(probableBranchConditionExprStr, '(', ')')) {
+ else if (StringUtil.isStrHasBalancedParentheses(probableBranchConditionExprStr, '(', ')')) {
thenTokenComputedRevisedIdx = idx;
isBreak = true;
break;
@@ -3033,7 +3035,7 @@ public class XPathParser
String probableElseExprStr = probableElseExprStrBuff.toString();
int elseTokenComputedRevisedIdx = 0;
- while (!XslTransformEvaluationHelper.isStrHasBalancedParentheses(probableElseExprStr, '(', ')')) {
+ while (!StringUtil.isStrHasBalancedParentheses(probableElseExprStr, '(', ')')) {
boolean isBreak = false;
for (int idx = (elseTokenEffectiveComputedIdx - 1); idx >= 0; idx--) {
Object tokenObj = (m_ops.m_tokenQueue).elementAt(idx);
@@ -3045,7 +3047,7 @@ public class XPathParser
probableElseExprStr += (tokenObj.toString() + " ");
}
probableElseExprStr = probableElseExprStr.trim();
- if (XslTransformEvaluationHelper.isStrHasBalancedParentheses(probableElseExprStr, '(', ')')) {
+ if (StringUtil.isStrHasBalancedParentheses(probableElseExprStr, '(', ')')) {
elseTokenComputedRevisedIdx = idx;
isBreak = true;
break;
@@ -3273,7 +3275,7 @@ public class XPathParser
char lParenChar = '(';
char rParenChar = ')';
- boolean isStrHasBalancedParentheses = XslTransformEvaluationHelper.isStrHasBalancedParentheses(
+ boolean isStrHasBalancedParentheses = StringUtil.isStrHasBalancedParentheses(
seqItemXPathExprStr,
lParenChar, rParenChar);
if (!isStrHasBalancedParentheses) {
@@ -3476,7 +3478,7 @@ public class XPathParser
char lParenChar = '(';
char rParenChar = ')';
- boolean isStrHasBalancedParentheses = XslTransformEvaluationHelper.isStrHasBalancedParentheses(seqItemXPathExprStr,
+ boolean isStrHasBalancedParentheses = StringUtil.isStrHasBalancedParentheses(seqItemXPathExprStr,
lParenChar, rParenChar);
if (!isStrHasBalancedParentheses) {
isXPathParseOkToProceed = false;
@@ -4473,8 +4475,10 @@ public class XPathParser
else if (m_tokenChar == '(')
{
nextToken();
- appendOp(2, OpCodes.OP_GROUP);
+ appendOp(2, OpCodes.OP_GROUP);
+ m_op_group_parse = true;
Expr();
+ m_op_group_parse = false;
consumeExpected(')');
m_ops.setOp(opPos + OpMap.MAPINDEX_LENGTH,
@@ -6178,7 +6182,7 @@ public class XPathParser
if (!(tokenIs(',') || tokenIs(rParen))) {
xpathExpr += m_token;
nextToken();
- if (tokenIs(rParen) && !XslTransformEvaluationHelper.isStrHasBalancedParentheses(lParen + xpathExpr, lParen, rParen)) {
+ if (tokenIs(rParen) && !StringUtil.isStrHasBalancedParentheses(lParen + xpathExpr, lParen, rParen)) {
if (lookahead(null, 1)) {
xpathExprPartList.add(xpathExpr);
break;
@@ -6198,7 +6202,7 @@ public class XPathParser
}
nextToken();
if (tokenIs(rParen)) {
- if (XslTransformEvaluationHelper.isStrHasBalancedParentheses(lParen + xpathExpr + rParen, lParen, rParen)
+ if (StringUtil.isStrHasBalancedParentheses(lParen + xpathExpr + rParen, lParen, rParen)
&& !lookahead(rParen, 1)) {
xpathExpr = (lParen + xpathExpr + m_token);
nextToken();
@@ -6394,7 +6398,11 @@ public class XPathParser
else if (tokenIs("function")) {
parseFunctionItemSequenceType(xpathSequenceTypeExpr);
if (m_token != null) {
- setSequenceTypeOccurenceIndicator(xpathSequenceTypeExpr, isXPathInlineFunctionParse);
+ setSequenceTypeOccurenceIndicator(xpathSequenceTypeExpr, isXPathInlineFunctionParse);
+ if (m_op_group_parse) {
+ m_token = ")";
+ m_tokenChar = ')';
+ }
}
}
else if (tokenIs("map")) {
@@ -6860,7 +6868,7 @@ public class XPathParser
nextToken();
}
else if (tokenIs(',')) {
- if (!XslTransformEvaluationHelper.isStrHasBalancedParentheses(typedFunctionTestParamSpec, '(', ')')) {
+ if (!StringUtil.isStrHasBalancedParentheses(typedFunctionTestParamSpec, '(', ')')) {
typedFunctionTestParamSpec = typedFunctionTestParamSpec + m_token;
nextToken();
}
@@ -6901,9 +6909,19 @@ public class XPathParser
consumeExpected("as");
String typedFunctionTestReturnType = "";
- while (m_token != null) {
- typedFunctionTestReturnType = typedFunctionTestReturnType + m_token;
- nextToken();
+ if (m_op_group_parse) {
+ while (m_token != null && !(lookahead(null, 1) || lookahead(null, 2))) {
+ typedFunctionTestReturnType = typedFunctionTestReturnType + m_token;
+ nextToken();
+ }
+
+ consumeExpected(')');
+ }
+ else {
+ while (m_token != null) {
+ typedFunctionTestReturnType = typedFunctionTestReturnType + m_token;
+ nextToken();
+ }
}
if (!"".equals(typedFunctionTestReturnType)) {
diff --git a/src/main/java/org/apache/xpath/composite/XPathLetExpr.java b/src/main/java/org/apache/xpath/composite/XPathLetExpr.java
index f812e7c9a..7385b931c 100644
--- a/src/main/java/org/apache/xpath/composite/XPathLetExpr.java
+++ b/src/main/java/org/apache/xpath/composite/XPathLetExpr.java
@@ -17,7 +17,6 @@
package org.apache.xpath.composite;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;
@@ -85,7 +84,7 @@ public class XPathLetExpr extends Expression {
prefixTable = (List<XMLNSDecl>)elemTemplateElement.getPrefixTable();
}
- Map<QName, XObject> letExprVarBindingMap = new HashMap<QName, XObject>();
+ Map<QName, XObject> xpathVarMap = xctxt.getXPathVarMap();
for (int idx = 0; idx < m_letExprVarBindingList.size(); idx++) {
LetExprVarBinding letExprVarBinding = m_letExprVarBindingList.get(idx);
@@ -124,6 +123,9 @@ public class XPathLetExpr extends Expression {
else if (expr instanceof XPathNamedFunctionReference) {
xpathNamedFuncRef = (XPathNamedFunctionReference)expr;
}
+ else if (expr instanceof Function) {
+ varBindingEvalResult = expr.execute(xctxt);
+ }
if (xpathNamedFuncRef != null) {
String funcNamespace = xpathNamedFuncRef.getFuncNamespace();
@@ -181,12 +183,9 @@ public class XPathLetExpr extends Expression {
m_xpathVarList.add(new QName(varName));
- letExprVarBindingMap.put(new QName(varName), varBindingEvalResult);
+ xpathVarMap.put(new QName(varName), varBindingEvalResult);
}
- Map<QName, XObject> xpathVarMap = xctxt.getXPathVarMap();
- xpathVarMap.putAll(letExprVarBindingMap);
-
if (prefixTable != null) {
m_returnExprXPathStr = XslTransformEvaluationHelper.replaceNsUrisWithPrefixesOnXPathStr(
m_returnExprXPathStr, prefixTable);
@@ -202,7 +201,7 @@ public class XPathLetExpr extends Expression {
evalResult = returnExprXpath.execute(xctxt, contextNode, xctxt.getNamespaceContext());
if (evalResult == null) {
- // To return an empty sequence
+ // Return an empty sequence
evalResult = new ResultSequence();
}
diff --git a/src/main/java/org/apache/xpath/composite/XPathSequenceConstructor.java b/src/main/java/org/apache/xpath/composite/XPathSequenceConstructor.java
index 7a109c0ed..4edb3362b 100644
--- a/src/main/java/org/apache/xpath/composite/XPathSequenceConstructor.java
+++ b/src/main/java/org/apache/xpath/composite/XPathSequenceConstructor.java
@@ -44,6 +44,7 @@ import org.apache.xpath.objects.XBooleanStatic;
import org.apache.xpath.objects.XMLNodeCursorImpl;
import org.apache.xpath.objects.XNumber;
import org.apache.xpath.objects.XObject;
+import org.apache.xpath.patterns.NodeTest;
import xml.xpath31.processor.types.XSBoolean;
import xml.xpath31.processor.types.XSNumericType;
@@ -109,7 +110,7 @@ public class XPathSequenceConstructor extends Expression {
int contextNode = xctxt.getContextNode();
- ElemTemplateElement elemTemplateElement = (ElemTemplateElement)xctxt.getNamespaceContext();
+ ElemTemplateElement elemTemplateElement = (ElemTemplateElement)(xctxt.getNamespaceContext());
List<XMLNSDecl> prefixTable = null;
if (elemTemplateElement != null) {
prefixTable = (List<XMLNSDecl>)elemTemplateElement.getPrefixTable();
@@ -123,7 +124,8 @@ public class XPathSequenceConstructor extends Expression {
ResultSequence resultSeq = new ResultSequence();
- for (int idx = 0; idx < m_sequenceConstructorXPathParts.size(); idx++) {
+ int seqConstructorPartsSize = m_sequenceConstructorXPathParts.size();
+ for (int idx = 0; idx < seqConstructorPartsSize; idx++) {
String xpathExprStr = m_sequenceConstructorXPathParts.get(idx);
if (prefixTable != null) {
@@ -152,10 +154,31 @@ public class XPathSequenceConstructor extends Expression {
if (dtmIter != null) {
int nextNode;
+ boolean isEmptyNodeSet = true;
while ((nextNode = dtmIter.nextNode()) != DTM.NULL)
{
+ isEmptyNodeSet = false;
XMLNodeCursorImpl xNodeSetItem = new XMLNodeCursorImpl(nextNode, xctxt);
- resultSeq.add(xNodeSetItem);
+ resultSeq.add(xNodeSetItem);
+ }
+
+ if (isEmptyNodeSet) {
+ String funcNameRef = ((NodeTest)xpathExpr).getLocalName();
+ XSL3FunctionService xslFunctionService = XSLFunctionBuilder.getXSLFunctionService();
+ int hashCharIdx = funcNameRef.indexOf('#');
+ if ((hashCharIdx > -1) && xslFunctionService.isFuncArityWellFormed(funcNameRef)) {
+ if (prefixTable != null) {
+ xpathExprStr = XslTransformEvaluationHelper.replaceNsUrisWithPrefixesOnXPathStr(xpathExprStr, prefixTable);
+ }
+
+ XPath xpathObj2 = new XPath(xpathExprStr, srcLocator, xctxt.getNamespaceContext(), XPath.SELECT, null);
+ if (m_vars != null) {
+ xpathObj2.fixupVariables(m_vars, m_globals_size);
+ }
+
+ Expression xpathExpr2 = xpathObj2.getExpression();
+ resultSeq.add((XPathNamedFunctionReference)xpathExpr2);
+ }
}
}
else if (xpathExprStr.startsWith("$") && xpathExprStr.contains("[") &&
@@ -229,6 +252,9 @@ public class XPathSequenceConstructor extends Expression {
XObject funcEvalResult = xsl3ConstructorOrExtensionFunction.execute(xctxt);
resultSeq.add(funcEvalResult);
}
+ else if (xpathExpr instanceof XPathNamedFunctionReference) {
+ resultSeq.add((XPathNamedFunctionReference)xpathExpr);
+ }
else {
if (m_vars != null) {
xpathObj.fixupVariables(m_vars, m_globals_size);
@@ -345,7 +371,7 @@ public class XPathSequenceConstructor extends Expression {
result = newResultSeq;
}
else {
- result = resultSeq;
+ result = resultSeq;
}
return result;
diff --git a/src/main/java/org/apache/xpath/functions/FuncDoc.java b/src/main/java/org/apache/xpath/functions/FuncDoc.java
index bb60bc107..5da43c6ec 100644
--- a/src/main/java/org/apache/xpath/functions/FuncDoc.java
+++ b/src/main/java/org/apache/xpath/functions/FuncDoc.java
@@ -25,6 +25,7 @@ import java.net.URL;
import javax.xml.transform.SourceLocator;
import javax.xml.transform.TransformerException;
+import org.apache.xalan.xslt.util.StringUtil;
import org.apache.xalan.xslt.util.XslTransformEvaluationHelper;
import org.apache.xpath.ExpressionNode;
import org.apache.xpath.XPathContext;
@@ -126,7 +127,7 @@ public class FuncDoc extends FunctionOneArg {
}
}
- String urlResourceStrContents = XslTransformEvaluationHelper.getStringContentFromUrl(resolvedArg0Url);
+ String urlResourceStrContents = StringUtil.getStringContentFromUrl(resolvedArg0Url);
result = FuncParseXml.getNodeSetFromStr(urlResourceStrContents, xctxt, m_errorHandler);
}
diff --git a/src/main/java/org/apache/xpath/functions/FuncFunctionArity.java b/src/main/java/org/apache/xpath/functions/FuncFunctionArity.java
index 8b310cb8b..ace49eca4 100644
--- a/src/main/java/org/apache/xpath/functions/FuncFunctionArity.java
+++ b/src/main/java/org/apache/xpath/functions/FuncFunctionArity.java
@@ -19,12 +19,14 @@ package org.apache.xpath.functions;
import java.util.Arrays;
import java.util.List;
+import java.util.Map;
import javax.xml.XMLConstants;
import javax.xml.transform.SourceLocator;
import javax.xml.transform.TransformerException;
import org.apache.xalan.templates.ElemFunction;
+import org.apache.xalan.templates.ElemVariable;
import org.apache.xalan.templates.StylesheetRoot;
import org.apache.xalan.transformer.TransformerImpl;
import org.apache.xalan.xslt.util.XslTransformEvaluationHelper;
@@ -81,9 +83,31 @@ public class FuncFunctionArity extends FunctionDef1Arg
if (arg0 instanceof Variable) {
Variable var1 = (Variable)arg0;
- org.apache.xpath.XPath xpathSelectExpr = (var1.getElemVariable()).getSelect();
- Expression selectExpr = xpathSelectExpr.getExpression();
+ Expression selectExpr = null;
+ ElemVariable elemVariable = var1.getElemVariable();
+ if (elemVariable != null) {
+ org.apache.xpath.XPath xpathSelectExpr = elemVariable.getSelect();
+ selectExpr = xpathSelectExpr.getExpression();
+ }
+ else {
+ Map<QName,XObject> xpathVarMap = xctxt.getXPathVarMap();
+ QName varQName = var1.getQName();
+ XObject varValue = xpathVarMap.get(varQName);
+ if (varValue != null) {
+ Object obj1 = varValue.object();
+ if (obj1 instanceof Function) {
+ Function func1 = (Function)obj1;
+ // REVISIT function arity may have more than one value
+ short arity = (func1.getDefinedArity())[0];
+ result = new XSInteger("" + arity);
+
+ return result;
+ }
+ }
+ }
+
XObject xObj = var1.execute(xctxt);
+
if (xObj instanceof XPathNamedFunctionReference) {
XPathNamedFunctionReference xpathNamedFunctionReference = (XPathNamedFunctionReference)xObj;
@@ -211,9 +235,8 @@ public class FuncFunctionArity extends FunctionDef1Arg
* This is an XPath function's arity value, computed mainly during
* XPath parse of function expression specified within an XSL
* stylesheet or an XPath literal expression. This arity value is
- * further verified below with an XPath function's arity value
- * defined within XPath 3.1 F&O spec and correspondingly configured
- * within Xalan-J code.
+ * verified below with an XPath function's arity value defined within
+ * XPath 3.1 F&O spec and correspondingly configured within Xalan-J code.
*/
final Short runTimeArity = xpathNamedFunctionReference.getArity();
@@ -224,6 +247,8 @@ public class FuncFunctionArity extends FunctionDef1Arg
String funcNameRefStr = "{" + funcNamespace + "}" + funcName + "#" + runTimeArity;
+ ElemFunction elemFunction = xpathNamedFunctionReference.getXslStylesheetFunction();
+
if ((FunctionTable.XPATH_BUILT_IN_FUNCS_NS_URI).equals(funcNamespace) || (FunctionTable.XPATH_BUILT_IN_MATH_FUNCS_NS_URI).equals(funcNamespace) ||
(FunctionTable.XPATH_BUILT_IN_MAP_FUNCS_NS_URI).equals(funcNamespace) ||
(FunctionTable.XPATH_BUILT_IN_ARRAY_FUNCS_NS_URI).equals(funcNamespace) ||
@@ -251,6 +276,9 @@ public class FuncFunctionArity extends FunctionDef1Arg
}
}
+ else if (elemFunction != null) {
+ result = new XSInteger("" + elemFunction.getArity());
+ }
if (result == null) {
throw new TransformerException("XPST0017 : An XSL function definition for function reference " + funcNameRefStr
diff --git a/src/main/java/org/apache/xpath/functions/FuncFunctionName.java b/src/main/java/org/apache/xpath/functions/FuncFunctionName.java
index 873ba8f5f..66c2047d9 100644
--- a/src/main/java/org/apache/xpath/functions/FuncFunctionName.java
+++ b/src/main/java/org/apache/xpath/functions/FuncFunctionName.java
@@ -19,12 +19,14 @@ package org.apache.xpath.functions;
import java.util.Arrays;
import java.util.List;
+import java.util.Map;
import javax.xml.XMLConstants;
import javax.xml.transform.SourceLocator;
import javax.xml.transform.TransformerException;
import org.apache.xalan.templates.ElemFunction;
+import org.apache.xalan.templates.ElemVariable;
import org.apache.xalan.templates.StylesheetRoot;
import org.apache.xalan.xslt.util.XslTransformEvaluationHelper;
import org.apache.xml.utils.QName;
@@ -80,8 +82,39 @@ public class FuncFunctionName extends FunctionDef1Arg
if (arg0 instanceof Variable) {
Variable var1 = (Variable)arg0;
- org.apache.xpath.XPath xpathSelectExpr = (var1.getElemVariable()).getSelect();
- Expression selectExpr = xpathSelectExpr.getExpression();
+ Expression selectExpr = null;
+ ElemVariable elemVariable = var1.getElemVariable();
+ if (elemVariable != null) {
+ org.apache.xpath.XPath xpathSelectExpr = elemVariable.getSelect();
+ selectExpr = xpathSelectExpr.getExpression();
+ }
+ else {
+ Map<QName,XObject> xpathVarMap = xctxt.getXPathVarMap();
+ QName varQName = var1.getQName();
+ XObject varValue = xpathVarMap.get(varQName);
+ if (varValue != null) {
+ Object obj1 = varValue.object();
+ if (obj1 instanceof XSL3ConstructorOrExtensionFunction) {
+ XSL3ConstructorOrExtensionFunction xsl3ConstructorOrExtensionFunction = (XSL3ConstructorOrExtensionFunction)obj1;
+ String localName = xsl3ConstructorOrExtensionFunction.getFunctionName();
+ String namespace = xsl3ConstructorOrExtensionFunction.getNamespace();
+
+ result = new XSQName(null, localName, namespace);
+
+ return result;
+ }
+ else if (obj1 instanceof Function) {
+ Function func1 = (Function)obj1;
+ String localName = func1.getLocalName();
+ String namespace = func1.getNamespace();
+
+ result = new XSQName(null, localName, namespace);
+
+ return result;
+ }
+ }
+ }
+
XObject xObj = var1.execute(xctxt);
if (xObj instanceof XPathNamedFunctionReference) {
XPathNamedFunctionReference xpathNamedFunctionReference = (XPathNamedFunctionReference)xObj;
@@ -257,7 +290,7 @@ public class FuncFunctionName extends FunctionDef1Arg
result = new XSQName(prefix, localName, namespace);
}
else {
- // REVISIT
+ result = new XSQName(prefix, localName, namespace);
}
return result;
diff --git a/src/main/java/org/apache/xpath/functions/FuncUnparsedText.java b/src/main/java/org/apache/xpath/functions/FuncUnparsedText.java
index eabfade54..04ad1b142 100644
--- a/src/main/java/org/apache/xpath/functions/FuncUnparsedText.java
+++ b/src/main/java/org/apache/xpath/functions/FuncUnparsedText.java
@@ -26,6 +26,7 @@ import java.net.URL;
import javax.xml.transform.SourceLocator;
import org.apache.xalan.res.XSLMessages;
+import org.apache.xalan.xslt.util.StringUtil;
import org.apache.xalan.xslt.util.XslTransformEvaluationHelper;
import org.apache.xpath.ExpressionNode;
import org.apache.xpath.XPathContext;
@@ -112,7 +113,7 @@ public class FuncUnparsedText extends Function2Args {
}
}
- String urlStrContents = XslTransformEvaluationHelper.getStringContentFromUrl(resolvedArg0Url);
+ String urlStrContents = StringUtil.getStringContentFromUrl(resolvedArg0Url);
String resultStr = null;
if (encodingStr != null) {
diff --git a/src/main/java/org/apache/xpath/functions/json/FuncJsonDoc.java b/src/main/java/org/apache/xpath/functions/json/FuncJsonDoc.java
index 1e74947dc..809bc2133 100644
--- a/src/main/java/org/apache/xpath/functions/json/FuncJsonDoc.java
+++ b/src/main/java/org/apache/xpath/functions/json/FuncJsonDoc.java
@@ -31,6 +31,7 @@ import java.util.Set;
import javax.xml.transform.SourceLocator;
import org.apache.xalan.res.XSLMessages;
+import org.apache.xalan.xslt.util.StringUtil;
import org.apache.xalan.xslt.util.XslTransformEvaluationHelper;
import org.apache.xpath.Expression;
import org.apache.xpath.XPathContext;
@@ -238,7 +239,7 @@ public class FuncJsonDoc extends JsonFunction {
resolvedArg0Url = new URL(hrefStrVal);
}
- String urlStrContents = XslTransformEvaluationHelper.getStringContentFromUrl(resolvedArg0Url);
+ String urlStrContents = StringUtil.getStringContentFromUrl(resolvedArg0Url);
result = getJsonXdmValueFromStr(urlStrContents, optionIsLiberal, optionDuplicatesValStr);
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_as-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_as-test-set_result.xml
index f9949db1f..bcbd16bba 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_as-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_as-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:36Z" fail="31" name="as" pass="73" skipped="4" statusUnknown="1" totalRun="105">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:53:47Z" fail="31" name="as" pass="73" skipped="4" statusUnknown="1" totalRun="105">
<testResult status="pass" testName="as-0101"/>
<testResult status="pass" testName="as-0102"/>
<testResult status="pass" testName="as-0103"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_avt-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_avt-test-set_result.xml
index 8eaba4088..6748ecd3d 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_avt-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_avt-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:37Z" fail="15" name="avt" pass="20" skipped="0" statusUnknown="0" totalRun="35">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:53:50Z" fail="15" name="avt" pass="20" skipped="0" statusUnknown="0" totalRun="35">
<testResult status="pass" testName="avt-0101"/>
<testResult status="fail" testName="avt-0201"/>
<testResult status="pass" testName="avt-0202"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_expand-text-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_expand-text-test-set_result.xml
index 3cd8edfb1..df1097fd5 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_expand-text-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_expand-text-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:58Z" fail="29" name="expand-text" pass="33" skipped="0" statusUnknown="0" totalRun="62">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:58Z" fail="29" name="expand-text" pass="33" skipped="0" statusUnknown="0" totalRun="62">
<testResult status="pass" testName="cvt-001"/>
<testResult status="pass" testName="cvt-002"/>
<testResult status="pass" testName="cvt-003"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_match-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_match-test-set_result.xml
index 62496a2e2..0ee66b0a4 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_match-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_match-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:37Z" fail="59" name="match" pass="69" skipped="8" statusUnknown="1" totalRun="129">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:53:51Z" fail="59" name="match" pass="69" skipped="8" statusUnknown="1" totalRun="129">
<testResult status="pass" testName="match-001"/>
<testResult status="pass" testName="match-002"/>
<testResult status="pass" testName="match-003"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_select-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_select-test-set_result.xml
index 8fc2baec5..de12fc664 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_select-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_select-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:38Z" fail="5" name="select" pass="19" skipped="0" statusUnknown="1" totalRun="25">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:53:55Z" fail="5" name="select" pass="19" skipped="0" statusUnknown="1" totalRun="25">
<testResult status="pass" testName="select-0101"/>
<testResult status="pass" testName="select-0102"/>
<testResult status="pass" testName="select-0201"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_xpath-default-namespace-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_xpath-default-namespace-test-set_result.xml
index b286d4a7f..09114c0bd 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_xpath-default-namespace-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/attr/_xpath-default-namespace-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:58Z" fail="15" name="xpath-default-namespace" pass="11" skipped="0" statusUnknown="0" totalRun="26">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:57Z" fail="15" name="xpath-default-namespace" pass="11" skipped="0" statusUnknown="0" totalRun="26">
<testResult status="pass" testName="xpath-default-namespace-0101"/>
<testResult status="pass" testName="xpath-default-namespace-0102"/>
<testResult status="pass" testName="xpath-default-namespace-0103"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/decl/_attribute-set-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/decl/_attribute-set-test-set_result.xml
index 43ae20a56..c2ac0445e 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/decl/_attribute-set-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/decl/_attribute-set-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:51Z" fail="8" name="attribute-set" pass="41" skipped="1" statusUnknown="0" totalRun="49">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:23Z" fail="8" name="attribute-set" pass="41" skipped="1" statusUnknown="0" totalRun="49">
<testResult status="pass" testName="attribute-set-0101"/>
<testResult status="fail" testName="attribute-set-0102">
<outResult/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/decl/_character-map-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/decl/_character-map-test-set_result.xml
index 266a8cf62..875ff2ab7 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/decl/_character-map-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/decl/_character-map-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:51Z" fail="12" name="character-map" pass="15" skipped="1" statusUnknown="1" totalRun="28">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:22Z" fail="12" name="character-map" pass="15" skipped="1" statusUnknown="1" totalRun="28">
<testResult status="pass" testName="character-map-001"/>
<testResult status="pass" testName="character-map-002"/>
<testResult status="pass" testName="character-map-003"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/decl/_function-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/decl/_function-test-set_result.xml
index 8a36c207f..f212b78f9 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/decl/_function-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/decl/_function-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:43Z" fail="18" name="function" pass="50" skipped="4" statusUnknown="1" totalRun="69">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:13Z" fail="18" name="function" pass="50" skipped="4" statusUnknown="1" totalRun="69">
<testResult status="fail" testName="function-0001">
<outResult/>
</testResult>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/decl/_variable-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/decl/_variable-test-set_result.xml
index edca9e945..82c49daf3 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/decl/_variable-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/decl/_variable-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:34Z" fail="3" name="variable" pass="16" skipped="0" statusUnknown="1" totalRun="20">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:53:44Z" fail="3" name="variable" pass="16" skipped="0" statusUnknown="1" totalRun="20">
<testResult status="pass" testName="variable-0101"/>
<testResult status="pass" testName="variable-0102"/>
<testResult status="pass" testName="variable-0103"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_axes-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_axes-test-set_result.xml
index 115e13d1e..7e96d94b0 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_axes-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_axes-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:51Z" fail="18" name="axes" pass="183" skipped="0" statusUnknown="0" totalRun="201">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:24Z" fail="18" name="axes" pass="183" skipped="0" statusUnknown="0" totalRun="201">
<testResult status="pass" testName="axes-001"/>
<testResult status="pass" testName="axes-002"/>
<testResult status="pass" testName="axes-003"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_castable-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_castable-test-set_result.xml
index 31d5c6cc0..cfbc2dfe2 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_castable-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_castable-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:52Z" fail="5" name="castable" pass="4" skipped="0" statusUnknown="0" totalRun="9">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:29Z" fail="5" name="castable" pass="4" skipped="0" statusUnknown="0" totalRun="9">
<testResult status="pass" testName="castable-001"/>
<testResult status="pass" testName="castable-002"/>
<testResult status="pass" testName="castable-003"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_expression-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_expression-test-set_result.xml
index 15502f6af..1ffc09c3a 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_expression-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_expression-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:52Z" fail="0" name="expression" pass="9" skipped="0" statusUnknown="1" totalRun="10">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:30Z" fail="0" name="expression" pass="9" skipped="0" statusUnknown="1" totalRun="10">
<testResult status="pass" testName="expression-0101"/>
<testResult status="pass" testName="expression-0301"/>
<testResult status="pass" testName="expression-0302"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_for-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_for-test-set_result.xml
index b8539c7eb..d36d7a5c6 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_for-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_for-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:52Z" fail="2" name="for" pass="1" skipped="0" statusUnknown="1" totalRun="4">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:30Z" fail="2" name="for" pass="1" skipped="0" statusUnknown="1" totalRun="4">
<testResult status="fail" testName="for-001"/>
<testResult status="fail" testName="for-002"/>
<testResult status="pass" testName="for-003"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_higher-order-functions-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_higher-order-functions-test-set_result.xml
index 293fb3b03..36776a051 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_higher-order-functions-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_higher-order-functions-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:54Z" fail="6" name="higher-order-functions" pass="18" skipped="0" statusUnknown="1" totalRun="25">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:36Z" fail="2" name="higher-order-functions" pass="22" skipped="0" statusUnknown="1" totalRun="25">
<testResult status="pass" testName="higher-order-functions-001"/>
<testResult status="pass" testName="higher-order-functions-002"/>
<testResult status="pass" testName="higher-order-functions-003"/>
@@ -9,7 +9,7 @@
<testResult status="pass" testName="higher-order-functions-008"/>
<testResult status="pass" testName="higher-order-functions-009"/>
<testResult status="pass" testName="higher-order-functions-010"/>
- <testResult status="fail" testName="higher-order-functions-011"/>
+ <testResult status="pass" testName="higher-order-functions-011"/>
<testResult status="pass" testName="higher-order-functions-012"/>
<testResult status="pass" testName="higher-order-functions-013"/>
<testResult status="pass" testName="higher-order-functions-014"/>
@@ -18,9 +18,9 @@
<testResult status="pass" testName="higher-order-functions-017"/>
<testResult status="pass" testName="higher-order-functions-018"/>
<testResult status="pass" testName="higher-order-functions-019"/>
- <testResult status="fail" testName="higher-order-functions-020"/>
- <testResult status="fail" testName="higher-order-functions-021"/>
- <testResult status="fail" testName="higher-order-functions-022"/>
+ <testResult status="pass" testName="higher-order-functions-020"/>
+ <testResult status="pass" testName="higher-order-functions-021"/>
+ <testResult status="pass" testName="higher-order-functions-022"/>
<testResult status="fail" testName="higher-order-functions-023"/>
<testResult status="fail" testName="higher-order-functions-024"/>
<testResult testName="higher-order-functions-025"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_math-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_math-test-set_result.xml
index e3963e9dc..81fc5a7a3 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_math-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_math-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:53Z" fail="25" name="math" pass="124" skipped="0" statusUnknown="1" totalRun="150">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:31Z" fail="25" name="math" pass="124" skipped="0" statusUnknown="1" totalRun="150">
<testResult status="pass" testName="math-0101"/>
<testResult status="pass" testName="math-3315"/>
<testResult status="pass" testName="math-0101"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_nodetest-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_nodetest-test-set_result.xml
index 8098b0c10..14effe6ee 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_nodetest-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_nodetest-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:54Z" fail="36" name="nodetest" pass="2" skipped="0" statusUnknown="0" totalRun="38">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:34Z" fail="36" name="nodetest" pass="2" skipped="0" statusUnknown="0" totalRun="38">
<testResult status="pass" testName="nodetest-001"/>
<testResult status="pass" testName="nodetest-002"/>
<testResult status="fail" testName="nodetest-003">
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_path-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_path-test-set_result.xml
index 955c3c0e6..0aeb83213 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_path-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_path-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:54Z" fail="3" name="path" pass="7" skipped="0" statusUnknown="0" totalRun="10">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:36Z" fail="3" name="path" pass="7" skipped="0" statusUnknown="0" totalRun="10">
<testResult status="pass" testName="path-001"/>
<testResult status="pass" testName="path-002"/>
<testResult status="pass" testName="path-003"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_predicate-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_predicate-test-set_result.xml
index ffdbed97f..1a98927a8 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_predicate-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/expr/_predicate-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:55Z" fail="7" name="predicate" pass="50" skipped="0" statusUnknown="0" totalRun="57">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:37Z" fail="7" name="predicate" pass="50" skipped="0" statusUnknown="0" totalRun="57">
<testResult status="fail" testName="predicate-001"/>
<testResult status="fail" testName="predicate-002"/>
<testResult status="fail" testName="predicate-003"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_deep-equal-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_deep-equal-test-set_result.xml
index a36400496..36625c1b3 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_deep-equal-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_deep-equal-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:57Z" fail="0" name="deep-equal" pass="2" skipped="0" statusUnknown="0" totalRun="2">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:47Z" fail="0" name="deep-equal" pass="2" skipped="0" statusUnknown="0" totalRun="2">
<testResult status="pass" testName="deep-equal-001"/>
<testResult status="pass" testName="deep-equal-002"/>
</testrun>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_format-number-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_format-number-test-set_result.xml
index ddfa3957f..97f0809c8 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_format-number-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_format-number-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:58Z" fail="32" name="format-number" pass="38" skipped="4" statusUnknown="0" totalRun="70">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:54Z" fail="32" name="format-number" pass="38" skipped="4" statusUnknown="0" totalRun="70">
<testResult status="fail" testName="format-number-001"/>
<testResult status="fail" testName="format-number-002"/>
<testResult status="fail" testName="format-number-003"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_json-to-xml-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_json-to-xml-test-set_result.xml
index e2e0967c6..3ffaf3840 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_json-to-xml-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_json-to-xml-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:58Z" fail="8" name="json-to-xml" pass="24" skipped="0" statusUnknown="1" totalRun="33">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:55:00Z" fail="8" name="json-to-xml" pass="24" skipped="0" statusUnknown="1" totalRun="33">
<testResult status="pass" testName="json-to-xml-001"/>
<testResult status="pass" testName="json-to-xml-002"/>
<testResult status="pass" testName="json-to-xml-003"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_key-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_key-test-set_result.xml
index 8d98753ff..8081da90a 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_key-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_key-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:57Z" fail="3" name="key" pass="21" skipped="0" statusUnknown="1" totalRun="25">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:53Z" fail="3" name="key" pass="21" skipped="0" statusUnknown="1" totalRun="25">
<testResult status="pass" testName="key-001"/>
<testResult status="fail" testName="key-002"/>
<testResult status="pass" testName="key-003"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_position-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_position-test-set_result.xml
index 5c3edbfed..fc8cab667 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_position-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_position-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:57Z" fail="11" name="position" pass="126" skipped="0" statusUnknown="1" totalRun="138">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:47Z" fail="11" name="position" pass="126" skipped="0" statusUnknown="1" totalRun="138">
<testResult status="pass" testName="position-0101"/>
<testResult status="fail" testName="position-0102"/>
<testResult status="fail" testName="position-0103"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_root-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_root-test-set_result.xml
index 7ad644f64..3a2648812 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_root-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/fn/_root-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:57Z" fail="3" name="root" pass="7" skipped="0" statusUnknown="0" totalRun="10">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:53Z" fail="3" name="root" pass="7" skipped="0" statusUnknown="0" totalRun="10">
<testResult status="pass" testName="root-0101"/>
<testResult status="fail" testName="root-0102"/>
<testResult status="pass" testName="root-0103"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_analyze-string-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_analyze-string-test-set_result.xml
index c35fda173..c92296198 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_analyze-string-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_analyze-string-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:57Z" fail="14" name="analyze-string" pass="39" skipped="5" statusUnknown="0" totalRun="53">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:51Z" fail="14" name="analyze-string" pass="39" skipped="5" statusUnknown="0" totalRun="53">
<testResult status="pass" testName="analyze-string-001"/>
<testResult status="pass" testName="analyze-string-002"/>
<testResult status="pass" testName="analyze-string-003"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_apply-templates-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_apply-templates-test-set_result.xml
index 4765bc032..00edd93da 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_apply-templates-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_apply-templates-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:38Z" fail="24" name="apply-templates" pass="22" skipped="4" statusUnknown="0" totalRun="46">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:53:56Z" fail="24" name="apply-templates" pass="22" skipped="4" statusUnknown="0" totalRun="46">
<testResult status="fail" testName="apply-templates-001">
<outResult><?xml version="1.0" encoding="UTF-8"?>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_attribute-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_attribute-test-set_result.xml
index 13c115fb7..2e634084a 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_attribute-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_attribute-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:39Z" fail="21" name="attribute" pass="8" skipped="0" statusUnknown="1" totalRun="30">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:00Z" fail="21" name="attribute" pass="8" skipped="0" statusUnknown="1" totalRun="30">
<testResult status="fail" testName="attribute-0001"/>
<testResult status="fail" testName="attribute-0002"/>
<testResult status="fail" testName="attribute-0003"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_call-template-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_call-template-test-set_result.xml
index 1fa688dfe..d53e44158 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_call-template-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_call-template-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:39Z" fail="14" name="call-template" pass="27" skipped="1" statusUnknown="0" totalRun="41">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:01Z" fail="14" name="call-template" pass="27" skipped="1" statusUnknown="0" totalRun="41">
<testResult status="fail" testName="call-template-0001">
<outResult><?xml version="1.0" encoding="UTF-8"?><out/></outResult>
</testResult>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_choose-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_choose-test-set_result.xml
index d0fadff61..c501ab3f3 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_choose-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_choose-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:39Z" fail="3" name="choose" pass="20" skipped="0" statusUnknown="1" totalRun="24">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:02Z" fail="3" name="choose" pass="20" skipped="0" statusUnknown="1" totalRun="24">
<testResult status="pass" testName="choose-0101"/>
<testResult status="pass" testName="choose-0102"/>
<testResult status="fail" testName="choose-0103"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_copy-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_copy-test-set_result.xml
index 12acce01a..5679503c5 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_copy-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_copy-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:40Z" fail="41" name="copy" pass="18" skipped="0" statusUnknown="1" totalRun="60">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:04Z" fail="41" name="copy" pass="18" skipped="0" statusUnknown="1" totalRun="60">
<testResult status="fail" testName="copy-0101"/>
<testResult status="pass" testName="copy-0102"/>
<testResult status="fail" testName="copy-0103"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_element-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_element-test-set_result.xml
index 880b4325f..450cc900c 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_element-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_element-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:42Z" fail="18" name="element" pass="11" skipped="0" statusUnknown="0" totalRun="29">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:10Z" fail="18" name="element" pass="11" skipped="0" statusUnknown="0" totalRun="29">
<testResult status="fail" testName="element-0001">
<outResult/>
</testResult>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_for-each-group-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_for-each-group-test-set_result.xml
index 77541e80e..0bbeade74 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_for-each-group-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_for-each-group-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:38Z" fail="24" name="for-each-group" pass="49" skipped="4" statusUnknown="1" totalRun="74">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:53:57Z" fail="24" name="for-each-group" pass="49" skipped="4" statusUnknown="1" totalRun="74">
<testResult status="pass" testName="for-each-group-001"/>
<testResult status="skipped" testName="for-each-group-002a" xsltVersion="xslt 2.0 only"/>
<testResult status="pass" testName="for-each-group-002"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_iterate-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_iterate-test-set_result.xml
index 07122de1d..781348c80 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_iterate-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_iterate-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:41Z" fail="25" name="iterate" pass="19" skipped="0" statusUnknown="0" totalRun="44">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:06Z" fail="25" name="iterate" pass="19" skipped="0" statusUnknown="0" totalRun="44">
<testResult status="pass" testName="iterate-001"/>
<testResult status="pass" testName="iterate-002"/>
<testResult status="pass" testName="iterate-003"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_sequence-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_sequence-test-set_result.xml
index 9ce82aade..10dfbcbad 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_sequence-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_sequence-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:41Z" fail="17" name="sequence" pass="8" skipped="1" statusUnknown="1" totalRun="26">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:08Z" fail="17" name="sequence" pass="8" skipped="1" statusUnknown="1" totalRun="26">
<testResult status="fail" testName="sequence-0101"/>
<testResult status="fail" testName="sequence-0102"/>
<testResult status="pass" testName="sequence-0103"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_sort-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_sort-test-set_result.xml
index 52f12040c..375b94b28 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_sort-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_sort-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:43Z" fail="31" name="sort" pass="50" skipped="0" statusUnknown="0" totalRun="81">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:10Z" fail="31" name="sort" pass="50" skipped="0" statusUnknown="0" totalRun="81">
<testResult status="pass" testName="sort-003"/>
<testResult status="pass" testName="sort-001"/>
<testResult status="pass" testName="sort-002"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_try-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_try-test-set_result.xml
index 24d27ddbe..6c59c2fb8 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_try-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_try-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:39Z" fail="22" name="try" pass="15" skipped="5" statusUnknown="0" totalRun="37">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:53:59Z" fail="22" name="try" pass="15" skipped="5" statusUnknown="0" totalRun="37">
<testResult status="pass" testName="try-001"/>
<testResult status="fail" testName="try-002">
<outResult/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_xsl-document-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_xsl-document-test-set_result.xml
index f76a6c965..10b80652e 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_xsl-document-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/insn/_xsl-document-test-set_result.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:58Z" fail="13" name="xsl-document" pass="12" skipped="0" statusUnknown="0" totalRun="25">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:57Z" fail="13" name="xsl-document" pass="12" skipped="0" statusUnknown="0" totalRun="25">
<testResult status="pass" testName="xsl-document-0101"/>
<testResult status="fail" testName="xsl-document-0102">
<outResult>
<errTrace>XPST0003 : An XPath expression /out/node()[1][self::comment()][.="Valuable comment"] has syntax error. Unknown op code : 0.</errTrace>
- <errTrace>java.lang.ArrayIndexOutOfBoundsException</errTrace>
+ <errTrace>java.lang.ArrayIndexOutOfBoundsException: -1</errTrace>
</outResult>
</testResult>
<testResult status="pass" testName="xsl-document-0103"/>
@@ -17,7 +17,7 @@
<testResult status="fail" testName="xsl-document-0301">
<outResult>
<errTrace>XPST0003 : An XPath expression /out/node()[1][self::*:e1][namespace-uri()="http://www.example.org/foo"][@t1="1"][@t2="2"][@t3="3"] has syntax error. Unknown op code : 0.</errTrace>
- <errTrace>java.lang.ArrayIndexOutOfBoundsException</errTrace>
+ <errTrace>java.lang.ArrayIndexOutOfBoundsException: -1</errTrace>
</outResult>
</testResult>
<testResult status="pass" testName="xsl-document-0302"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/misc/_regex-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/misc/_regex-test-set_result.xml
index 607dafeac..ef312f537 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/misc/_regex-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/misc/_regex-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:58Z" fail="12" name="regex" pass="32" skipped="1" statusUnknown="0" totalRun="44">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:56Z" fail="12" name="regex" pass="32" skipped="1" statusUnknown="0" totalRun="44">
<testResult status="pass" testName="regex-001"/>
<testResult status="fail" testName="regex-002"/>
<testResult status="pass" testName="regex-003"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/type/_boolean-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/type/_boolean-test-set_result.xml
index f480fbcd4..8c45dca43 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/type/_boolean-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/type/_boolean-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:55Z" fail="25" name="boolean" pass="87" skipped="0" statusUnknown="0" totalRun="112">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:38Z" fail="25" name="boolean" pass="87" skipped="0" statusUnknown="0" totalRun="112">
<testResult status="pass" testName="boolean-001"/>
<testResult status="pass" testName="boolean-002"/>
<testResult status="pass" testName="boolean-003"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/type/_date-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/type/_date-test-set_result.xml
index 103d0953a..0a040391e 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/type/_date-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/type/_date-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:55Z" fail="28" name="date" pass="56" skipped="0" statusUnknown="1" totalRun="85">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:44Z" fail="28" name="date" pass="56" skipped="0" statusUnknown="1" totalRun="85">
<testResult status="pass" testName="date-001"/>
<testResult status="pass" testName="date-002"/>
<testResult status="pass" testName="date-003"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/type/_node-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/type/_node-test-set_result.xml
index 548e72db5..35d8e9c85 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/type/_node-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/type/_node-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:55Z" fail="17" name="node" pass="15" skipped="0" statusUnknown="0" totalRun="32">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:40Z" fail="17" name="node" pass="15" skipped="0" statusUnknown="0" totalRun="32">
<testResult status="pass" testName="node-0101"/>
<testResult status="pass" testName="node-0201"/>
<testResult status="fail" testName="node-0301">
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/type/_string-test-set_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/type/_string-test-set_result.xml
index b492026df..ea98b48d8 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/type/_string-test-set_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/type/_string-test-set_result.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-21T15:07:55Z" fail="8" name="string" pass="128" skipped="0" statusUnknown="0" totalRun="136">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-08-27T11:54:41Z" fail="8" name="string" pass="128" skipped="0" statusUnknown="0" totalRun="136">
<testResult status="pass" testName="string-001"/>
<testResult status="pass" testName="string-002"/>
<testResult status="pass" testName="string-003"/>
diff --git a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/w3c_xslt3_testsuite_xalan-j_result.xml b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/w3c_xslt3_testsuite_xalan-j_result.xml
index e87b391ca..1300559a0 100644
--- a/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/w3c_xslt3_testsuite_xalan-j_result.xml
+++ b/src/test/java/org/apache/xalan/tests/w3c/xslt3/result/w3c_xslt3_testsuite_xalan-j_result.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<testResult dateTime="2025-08-21T15:08:09Z" desc="W3C XSLT 3.0 test suite results" fail="711" pass="1579" skipped="43" success="68.38%" totalRun="2309" xslt_processor="Xalan-J XSLT 3.0 development code">
+<testResult dateTime="2025-08-27T11:55:11Z" desc="W3C XSLT 3.0 test suite results" fail="707" pass="1583" skipped="43" success="68.56%" totalRun="2309" xslt_processor="Xalan-J XSLT 3.0 development code">
<attr>
<as fail="31" pass="73" skipped="4" success="69.52%" totalRun="105"/>
<avt fail="15" pass="20" skipped="0" success="57.14%" totalRun="35"/>
@@ -19,7 +19,7 @@
<castable fail="5" pass="4" skipped="0" success="44.44%" totalRun="9"/>
<expression fail="0" pass="9" skipped="0" success="90.0%" totalRun="10"/>
<for fail="2" pass="1" skipped="0" success="25.0%" totalRun="4"/>
- <higher-order-functions fail="6" pass="18" skipped="0" success="72.0%" totalRun="25"/>
+ <higher-order-functions fail="2" pass="22" skipped="0" success="88.0%" totalRun="25"/>
<math fail="25" pass="124" skipped="0" success="82.67%" totalRun="150"/>
<nodetest fail="36" pass="2" skipped="0" success="5.26%" totalRun="38"/>
<path fail="3" pass="7" skipped="0" success="70.0%" totalRun="10"/>
diff --git a/src/test/resources/fn_json_doc/test3.xsl b/src/test/resources/fn_json_doc/test3.xsl
index fb85c629b..396e445e3 100644
--- a/src/test/resources/fn_json_doc/test3.xsl
+++ b/src/test/resources/fn_json_doc/test3.xsl
@@ -41,12 +41,13 @@
<xsl:variable name="size" select="map:get($info,'size')" as="xs:double"/>
<xsl:variable name="weight" select="map:get($info,'weight')" as="xs:double"/>
<xsl:variable name="color" select="map:get($info,'color')" as="xs:string"/>
- <xsl:sequence select="let $m1 := map {}, $m1 := map:put($m1,'id',$id),
- $m1 := map:put($m1,'desc',$desc),
- $i1 := map {}, $i1 := map:put($i1,'size',$size),
- $i1 := map:put($i1,'weight',$weight),
- $i1 := map:put($i1,'color',$color),
- $m1 := map:put($m1,'info',$i1) return $m1"/>
+ <xsl:sequence select="map {'id' : $id,
+ 'desc' : $desc,
+ 'info' : map {'size' : $size,
+ 'weight' : $weight,
+ 'color' : $color
+ }
+ }"/>
</xsl:function>
<!--
diff --git a/src/test/resources/fn_parse_json/test12.xsl b/src/test/resources/fn_parse_json/test12.xsl
index 7dfadfd45..5704e51ae 100644
--- a/src/test/resources/fn_parse_json/test12.xsl
+++ b/src/test/resources/fn_parse_json/test12.xsl
@@ -41,12 +41,13 @@
<xsl:variable name="size" select="map:get($info,'size')" as="xs:double"/>
<xsl:variable name="weight" select="map:get($info,'weight')" as="xs:double"/>
<xsl:variable name="color" select="map:get($info,'color')" as="xs:string"/>
- <xsl:sequence select="let $m1 := map {}, $m1 := map:put($m1,'id',$id),
- $m1 := map:put($m1,'desc',$desc),
- $i1 := map {}, $i1 := map:put($i1,'size',$size),
- $i1 := map:put($i1,'weight',$weight),
- $i1 := map:put($i1,'color',$color),
- $m1 := map:put($m1,'info',$i1) return $m1"/>
+ <xsl:sequence select="map {'id' : $id,
+ 'desc' : $desc,
+ 'info' : map {'size' : $size,
+ 'weight' : $weight,
+ 'color' : $color
+ }
+ }"/>
</xsl:function>
<!--
diff --git a/src/test/resources/xsl_higher_order_functions/test9.xsl b/src/test/resources/xsl_higher_order_functions/test9.xsl
index 99960de29..7d27a2ea1 100644
--- a/src/test/resources/xsl_higher_order_functions/test9.xsl
+++ b/src/test/resources/xsl_higher_order_functions/test9.xsl
@@ -23,9 +23,7 @@
<xsl:sequence select="$x + 2"/>
</xsl:function>
- <xsl:variable name="f" as="function(*)*">
- <xsl:sequence select="(fn0:g#1, fn0:h#1)"/>
- </xsl:variable>
+ <xsl:variable name="f" select="(fn0:g#1, fn0:h#1)" as="function(*)*"/>
<xsl:template name="main">
<result>
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xalan.apache.org
For additional commands, e-mail: commits-help@xalan.apache.org