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/10/09 12:13:18 UTC
(xalan-java) branch xalan-j_xslt3.0_mvn updated: committing xalan-j xpath 3.1 operator '||' implementation 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 6ff147ec6 committing xalan-j xpath 3.1 operator '||' implementation improvements
6ff147ec6 is described below
commit 6ff147ec67b05638dc86f358e35288ebce5f438d
Author: Mukul Gandhi <ga...@gmail.com>
AuthorDate: Thu Oct 9 17:42:51 2025 +0530
committing xalan-j xpath 3.1 operator '||' implementation improvements
---
README | 6 +-
.../apache/xalan/templates/ElemApplyTemplates.java | 2 +-
.../java/org/apache/xalan/templates/ElemCatch.java | 2 +-
.../java/org/apache/xalan/templates/ElemCopy.java | 4 +-
.../org/apache/xalan/templates/ElemCopyOf.java | 53 ++++++++++++++++--
.../org/apache/xalan/templates/ElemEvaluate.java | 2 +-
.../org/apache/xalan/templates/ElemSequence.java | 8 ++-
.../org/apache/xalan/templates/ElemTemplate.java | 2 +-
.../java/org/apache/xalan/templates/ElemTry.java | 2 +-
src/main/java/org/apache/xml/dtm/DTMManager.java | 7 ++-
src/main/java/org/apache/xpath/compiler/Lexer.java | 65 +++++++++++++++++++++-
.../xpath/composite/XPathSequenceConstructor.java | 55 ++++++++++++++++--
.../w3c/xslt3/result/insn/_try-test-set_result.xml | 4 +-
.../result/w3c_xslt3_testsuite_xalan-j_result.xml | 4 +-
.../tests/xpath3/XPathStringConcatExprTests.java | 12 ++++
src/test/resources/stringConcatExpr/gold/test6.out | 8 +++
src/test/resources/stringConcatExpr/test6.xsl | 43 ++++++++++++++
17 files changed, 247 insertions(+), 32 deletions(-)
diff --git a/README b/README
index 43b96f334..5d58fb373 100644
--- a/README
+++ b/README
@@ -17,7 +17,7 @@
Copyright 1999-2025 The Apache Software Foundation
-Document last modified : 2025-10-08
+Document last modified : 2025-10-09
Authors:
Gary Gregory <gg...@apache.org>
@@ -49,11 +49,11 @@ The Maven build results like following shall be produced:
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running org.apache.xalan.tests.main.AllXalanXSLT3Tests
-[INFO] Tests run: 1320, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: ..... - in org.apache.xalan.tests.main.AllXalanXSLT3Tests
+[INFO] Tests run: 1321, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: ..... - in org.apache.xalan.tests.main.AllXalanXSLT3Tests
[INFO]
[INFO] Results:
[INFO]
-[INFO] Tests run: 1320, Failures: 0, Errors: 0, Skipped: 0
+[INFO] Tests run: 1321, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- jar:3.3.0:jar (default-jar) @ xalan-java ---
diff --git a/src/main/java/org/apache/xalan/templates/ElemApplyTemplates.java b/src/main/java/org/apache/xalan/templates/ElemApplyTemplates.java
index 754510ce5..e8bf18160 100644
--- a/src/main/java/org/apache/xalan/templates/ElemApplyTemplates.java
+++ b/src/main/java/org/apache/xalan/templates/ElemApplyTemplates.java
@@ -717,7 +717,7 @@ public class ElemApplyTemplates extends ElemCallTemplate
}
else {
ElemCopyOf.copyOfActionOnResultSequence((ResultSequence)templateEvalResultForAsAttr,
- transformer, handler, xctxt, false);
+ transformer, handler, xctxt, false, this);
}
}
catch (TransformerException ex) {
diff --git a/src/main/java/org/apache/xalan/templates/ElemCatch.java b/src/main/java/org/apache/xalan/templates/ElemCatch.java
index 73cc2e66d..e27fe29c3 100644
--- a/src/main/java/org/apache/xalan/templates/ElemCatch.java
+++ b/src/main/java/org/apache/xalan/templates/ElemCatch.java
@@ -205,7 +205,7 @@ public class ElemCatch extends ElemTemplateElement implements ExpressionOwner {
rSeq.add(xpathEvalResult);
SerializationHandler handler = transformer.getSerializationHandler();
try {
- ElemCopyOf.copyOfActionOnResultSequence(rSeq, transformer, handler, xctxt, false);
+ ElemCopyOf.copyOfActionOnResultSequence(rSeq, transformer, handler, xctxt, false, this);
}
catch (TransformerException ex) {
throw new javax.xml.transform.TransformerException("XPTY0004 : An exception occured while serializing xsl:catch's evaluation "
diff --git a/src/main/java/org/apache/xalan/templates/ElemCopy.java b/src/main/java/org/apache/xalan/templates/ElemCopy.java
index bec761747..805bea5b0 100644
--- a/src/main/java/org/apache/xalan/templates/ElemCopy.java
+++ b/src/main/java/org/apache/xalan/templates/ElemCopy.java
@@ -298,7 +298,7 @@ public class ElemCopy extends ElemUse
+ "in a sequence of length greater than one.", srcLocator);
}
else if (rSeq.size() == 1) {
- ElemCopyOf.copyOfActionOnResultSequence(rSeq, transformer, rthandler, xctxt, false);
+ ElemCopyOf.copyOfActionOnResultSequence(rSeq, transformer, rthandler, xctxt, false, this);
return;
}
@@ -308,7 +308,7 @@ public class ElemCopy extends ElemUse
else {
ResultSequence rSeq = new ResultSequence();
rSeq.add(xObj);
- ElemCopyOf.copyOfActionOnResultSequence(rSeq, transformer, rthandler, xctxt, false);
+ ElemCopyOf.copyOfActionOnResultSequence(rSeq, transformer, rthandler, xctxt, false, this);
return;
}
diff --git a/src/main/java/org/apache/xalan/templates/ElemCopyOf.java b/src/main/java/org/apache/xalan/templates/ElemCopyOf.java
index fc1d28171..054b3de39 100644
--- a/src/main/java/org/apache/xalan/templates/ElemCopyOf.java
+++ b/src/main/java/org/apache/xalan/templates/ElemCopyOf.java
@@ -58,10 +58,12 @@ import org.apache.xpath.objects.XPathInlineFunction;
import org.apache.xpath.objects.XPathMap;
import org.apache.xpath.objects.XString;
import org.apache.xpath.types.XMLAttribute;
+import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
import xml.xpath31.processor.types.XSAnyAtomicType;
+import xml.xpath31.processor.types.XSQName;
import xml.xpath31.processor.types.XSUntyped;
import xml.xpath31.processor.types.XSUntypedAtomic;
@@ -386,7 +388,7 @@ public class ElemCopyOf extends ElemTemplateElement
}
}
}
- copyOfActionOnResultSequence(resultSequence, transformer, rhandler, xctxt, false);
+ copyOfActionOnResultSequence(resultSequence, transformer, rhandler, xctxt, false, this);
break;
case XObject.CLASS_ARRAY :
XPathArray xpathArray = (XPathArray)value;
@@ -402,7 +404,7 @@ public class ElemCopyOf extends ElemTemplateElement
}
}
}
- copyOfActionOnResultSequence(resultSequenceArr, transformer, rhandler, xctxt, false);
+ copyOfActionOnResultSequence(resultSequenceArr, transformer, rhandler, xctxt, false, this);
break;
case XObject.CLASS_UNKNOWN :
if (value instanceof XMLAttribute) {
@@ -560,14 +562,54 @@ public class ElemCopyOf extends ElemTemplateElement
*/
public static void copyOfActionOnResultSequence(ResultSequence resultSequence, TransformerImpl transformer,
SerializationHandler serializationHandler,
- XPathContext xctxt, boolean xslSeqProc) throws TransformerException, SAXException {
+ XPathContext xctxt, boolean xslSeqProc, ElemTemplateElement elemTemplateElem)
+ throws TransformerException, SAXException {
char[] spaceCharArr = new char[1];
spaceCharArr[0] = SPACE_CHAR;
String strVal = null;
- for (int idx = 0; idx < resultSequence.size(); idx++) {
+ int rSeqLength = resultSequence.size();
+ for (int idx = 0; idx < rSeqLength; idx++) {
XObject xdmItem = resultSequence.item(idx);
+ if (xdmItem instanceof XMLNodeCursorImpl) {
+ XMLNodeCursorImpl xmlNodeCursorImpl = (XMLNodeCursorImpl)xdmItem;
+ int nodeHandle = xmlNodeCursorImpl.asNode(xctxt);
+ DTM dtm = xctxt.getDTM(nodeHandle);
+ boolean flg1 = false;
+ if (dtm.getNodeType(nodeHandle) == DTM.ELEMENT_NODE) {
+ Node node = dtm.getNode(nodeHandle);
+ String nodeName = node.getNodeName();
+ try {
+ if (nodeName.startsWith("b_")) {
+ Integer int1 = Integer.valueOf(nodeName.substring(2));
+ Element elemNode = (Element)node;
+ xdmItem = new XString(elemNode.getTextContent());
+ }
+ else {
+ flg1 = true;
+ }
+ }
+ catch (Exception ex) {
+ flg1 = true;
+ }
+ }
+
+ if (flg1) {
+ xdmItem = resultSequence.item(idx);
+ xdmItem = xdmItem.getFresh();
+ }
+ }
+ else if (xdmItem instanceof XSQName) {
+ XSQName xsQName = (XSQName)xdmItem;
+ String localPart = xsQName.getLocalPart();
+ String nsUri = xsQName.getNamespaceUri();
+ if (Constants.XSL_ERROR_NAMESACE.equals(nsUri)) {
+ List<XMLNSDecl> prefixTable = (List<XMLNSDecl>)elemTemplateElem.getPrefixTable();
+ String nsPrefix = XslTransformEvaluationHelper.getPrefixFromNsUri(nsUri, prefixTable);
+ xdmItem = new XString(nsPrefix + ":" + localPart);
+ }
+ }
if ((xdmItem instanceof XBoolean) || (xdmItem instanceof XNumber) || (xdmItem instanceof XString)) {
strVal = xdmItem.str();
@@ -625,7 +667,8 @@ public class ElemCopyOf extends ElemTemplateElement
copyOfActionOnNodeSet((XMLNodeCursorImpl)xdmItem, transformer, serializationHandler, xctxt);
}
else if (xdmItem.getType() == XObject.CLASS_RESULT_SEQUENCE) {
- copyOfActionOnResultSequence((ResultSequence)xdmItem, transformer, serializationHandler, xctxt, xslSeqProc);
+ copyOfActionOnResultSequence((ResultSequence)xdmItem, transformer, serializationHandler, xctxt,
+ xslSeqProc, elemTemplateElem);
}
}
}
diff --git a/src/main/java/org/apache/xalan/templates/ElemEvaluate.java b/src/main/java/org/apache/xalan/templates/ElemEvaluate.java
index 46d51e4ff..522148467 100644
--- a/src/main/java/org/apache/xalan/templates/ElemEvaluate.java
+++ b/src/main/java/org/apache/xalan/templates/ElemEvaluate.java
@@ -568,7 +568,7 @@ public class ElemEvaluate extends ElemTemplateElement {
break;
case XObject.CLASS_RESULT_SEQUENCE :
ResultSequence resultSequence = (ResultSequence)xdmItem;
- ElemCopyOf.copyOfActionOnResultSequence(resultSequence, transformer, handler, xctxt, true);
+ ElemCopyOf.copyOfActionOnResultSequence(resultSequence, transformer, handler, xctxt, true, this);
break;
case XObject.CLASS_ARRAY :
XslTransformData.m_xpathArray = (XPathArray)xdmItem;
diff --git a/src/main/java/org/apache/xalan/templates/ElemSequence.java b/src/main/java/org/apache/xalan/templates/ElemSequence.java
index 90c58c1f4..c5a438f38 100644
--- a/src/main/java/org/apache/xalan/templates/ElemSequence.java
+++ b/src/main/java/org/apache/xalan/templates/ElemSequence.java
@@ -26,8 +26,8 @@ import javax.xml.transform.TransformerException;
import org.apache.xalan.serialize.SerializerUtils;
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.serializer.SerializationHandler;
@@ -617,8 +617,10 @@ public class ElemSequence extends ElemTemplateElement
SerializerUtils.outputResultTreeFragment(handler, xslSequenceVal, xctxt);
break;
case XObject.CLASS_RESULT_SEQUENCE :
- ResultSequence resultSequence = (ResultSequence)xslSequenceVal;
- ElemCopyOf.copyOfActionOnResultSequence(resultSequence, transformer, handler, xctxt, true);
+ ResultSequence resultSequence = (ResultSequence)xslSequenceVal;
+ boolean isXslSeqXslCatchChild = (getParentElem() instanceof ElemCatch) ? true : false;
+ ElemCopyOf.copyOfActionOnResultSequence(resultSequence, transformer, handler, xctxt,
+ !isXslSeqXslCatchChild ? true: false, this);
break;
default :
// NO OP
diff --git a/src/main/java/org/apache/xalan/templates/ElemTemplate.java b/src/main/java/org/apache/xalan/templates/ElemTemplate.java
index 788465254..ba25f3d0f 100644
--- a/src/main/java/org/apache/xalan/templates/ElemTemplate.java
+++ b/src/main/java/org/apache/xalan/templates/ElemTemplate.java
@@ -600,7 +600,7 @@ public class ElemTemplate extends ElemTemplateElement
rSeq.add(xslTemplateEvalResult);
}
- ElemCopyOf.copyOfActionOnResultSequence(rSeq, transformer, handler, xctxt, false);
+ ElemCopyOf.copyOfActionOnResultSequence(rSeq, transformer, handler, xctxt, false, this);
}
}
catch (TransformerException ex) {
diff --git a/src/main/java/org/apache/xalan/templates/ElemTry.java b/src/main/java/org/apache/xalan/templates/ElemTry.java
index 994359d30..7b0d0fe54 100644
--- a/src/main/java/org/apache/xalan/templates/ElemTry.java
+++ b/src/main/java/org/apache/xalan/templates/ElemTry.java
@@ -229,7 +229,7 @@ public class ElemTry extends ElemTemplateElement implements ExpressionOwner {
ResultSequence rSeq = new ResultSequence();
rSeq.add(xpathEvalResult);
SerializationHandler handler = transformer.getSerializationHandler();
- ElemCopyOf.copyOfActionOnResultSequence(rSeq, transformer, handler, xctxt, false);
+ ElemCopyOf.copyOfActionOnResultSequence(rSeq, transformer, handler, xctxt, false, this);
}
catch (TransformerException ex) {
// Process XSL transformation exception with any suitable
diff --git a/src/main/java/org/apache/xml/dtm/DTMManager.java b/src/main/java/org/apache/xml/dtm/DTMManager.java
index 1910e1831..4de4035e8 100644
--- a/src/main/java/org/apache/xml/dtm/DTMManager.java
+++ b/src/main/java/org/apache/xml/dtm/DTMManager.java
@@ -271,9 +271,10 @@ public abstract class DTMManager
DocumentBuilder dBuilder = dbf.newDocumentBuilder();
Document document = dBuilder.newDocument();
- // Generate arbitrary random XML element names
- String docElemName = "a_" + System.currentTimeMillis();
- String childElemName = "b_" + System.currentTimeMillis();
+ // Produce, random XML element name values
+ String str1 = String.valueOf(System.currentTimeMillis());
+ String docElemName = "a_" + str1.substring(0, 5);
+ String childElemName = "b_" + str1.substring(0, 5);
Element docElem = document.createElement(docElemName);
for (int idx = 0; idx < resultSeq.size(); idx++) {
diff --git a/src/main/java/org/apache/xpath/compiler/Lexer.java b/src/main/java/org/apache/xpath/compiler/Lexer.java
index 6890cc8f7..8710e069c 100644
--- a/src/main/java/org/apache/xpath/compiler/Lexer.java
+++ b/src/main/java/org/apache/xpath/compiler/Lexer.java
@@ -143,9 +143,13 @@ class Lexer
// Nesting of '[' so we can know if the given element should be
// counted inside the m_patternMap.
- int nesting = 0;
+ int nesting = 0;
+
+ if (pat.contains("||")) {
+ pat = getTransformedPatternStr(pat, "||");
+ nChars = pat.length();
+ }
- // char[] chars = pat.toCharArray();
for (int i = 0; i < nChars; i++)
{
char c = pat.charAt(i);
@@ -974,4 +978,61 @@ class Lexer
return m_ns_unbound_prefix;
}
+ /**
+ * Method definition, to do string transformation of the
+ * supplied string value, around the supplied delimiter string.
+ *
+ * This method is defined, primarily to perform few types of
+ * XPath 3.1 string concatenation "||" operator evaluations
+ * correctly.
+ *
+ * The following types of string value transformations,
+ * are performed by this method definition:
+ * a||b||c -> a || b || c
+ * a||b -> a || b
+ * a|| b -> a || b
+ * a ||b -> a || b etc
+ *
+ * @param pat The supplied pattern string
+ * @param delim The supplied delimiter, string
+ * @return The transformed string value
+ */
+ String getTransformedPatternStr(String pat, String delim) {
+
+ String result = null;
+
+ int nChars = pat.length();
+
+ int pIdx = pat.indexOf(delim, 0);
+ int srchStart = 0;
+ while ((pIdx - 1 >= 0) && pat.charAt(pIdx - 1) != ' ') {
+ String prefxStr = pat.substring(0, pIdx);
+ String pat1 = prefxStr + ' ' + delim ;
+ String pat2 = "";
+ if (pIdx + 2 < nChars) {
+ pat2 = pat.substring(pIdx + 2);
+ }
+ pat = pat1 + pat2;
+ nChars = pat.length();
+
+ pIdx = pat.indexOf(delim, srchStart);
+ if ((pIdx + 2 < nChars) && (pat.charAt(pIdx + 2) != ' ')) {
+ pat1 = pat.substring(0, pIdx + 2) + ' ';
+ pat2 = pat.substring(pIdx + 2);
+ pat = pat1 + pat2;
+ nChars = pat.length();
+ }
+
+ int idx2 = pat.indexOf(delim);
+ if (idx2 + 2 < nChars) {
+ srchStart = idx2 + 2;
+ pIdx = pat.indexOf(delim, srchStart);
+ }
+ }
+
+ result = pat;
+
+ return result;
+ }
+
}
diff --git a/src/main/java/org/apache/xpath/composite/XPathSequenceConstructor.java b/src/main/java/org/apache/xpath/composite/XPathSequenceConstructor.java
index 4edb3362b..e27938894 100644
--- a/src/main/java/org/apache/xpath/composite/XPathSequenceConstructor.java
+++ b/src/main/java/org/apache/xpath/composite/XPathSequenceConstructor.java
@@ -44,7 +44,10 @@ 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.objects.XString;
import org.apache.xpath.patterns.NodeTest;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
import xml.xpath31.processor.types.XSBoolean;
import xml.xpath31.processor.types.XSNumericType;
@@ -124,8 +127,8 @@ public class XPathSequenceConstructor extends Expression {
ResultSequence resultSeq = new ResultSequence();
- int seqConstructorPartsSize = m_sequenceConstructorXPathParts.size();
- for (int idx = 0; idx < seqConstructorPartsSize; idx++) {
+ int seqCstrPartsSize = m_sequenceConstructorXPathParts.size();
+ for (int idx = 0; idx < seqCstrPartsSize; idx++) {
String xpathExprStr = m_sequenceConstructorXPathParts.get(idx);
if (prefixTable != null) {
@@ -277,8 +280,9 @@ public class XPathSequenceConstructor extends Expression {
}
}
else if (xPathExprPartResult instanceof ResultSequence) {
- ResultSequence inpResultSeq = (ResultSequence)xPathExprPartResult;
- for (int idx1 = 0; idx1 < inpResultSeq.size(); idx1++) {
+ ResultSequence inpResultSeq = (ResultSequence)xPathExprPartResult;
+ int rSeqLength = inpResultSeq.size();
+ for (int idx1 = 0; idx1 < rSeqLength; idx1++) {
XObject xObj = inpResultSeq.item(idx1);
resultSeq.add(xObj);
}
@@ -351,7 +355,8 @@ public class XPathSequenceConstructor extends Expression {
ResultSequence newResultSeq = new ResultSequence();
- for (int idx = 0; idx < resultSeq.size(); idx++) {
+ int rSeqLength = resultSeq.size();
+ for (int idx = 0; idx < rSeqLength; idx++) {
XObject xObj = resultSeq.item(idx);
if (xObj instanceof XMLNodeCursorImpl) {
XMLNodeCursorImpl xmlNodeCursorImpl = (XMLNodeCursorImpl)xObj;
@@ -374,6 +379,46 @@ public class XPathSequenceConstructor extends Expression {
result = resultSeq;
}
+ if (result instanceof ResultSequence) {
+ ResultSequence rSeq = (ResultSequence)result;
+ int rSeqLength = rSeq.size();
+ for (int idx = 0; idx < rSeqLength; idx++) {
+ XObject xdmItem = rSeq.item(idx);
+ if (xdmItem instanceof XMLNodeCursorImpl) {
+ XMLNodeCursorImpl xmlNodeCursorImpl = (XMLNodeCursorImpl)xdmItem;
+ int nodeHandle = xmlNodeCursorImpl.asNode(xctxt);
+ DTM dtm = xctxt.getDTM(nodeHandle);
+ boolean flg1 = false;
+ if (dtm.getNodeType(nodeHandle) == DTM.ELEMENT_NODE) {
+ Node node = dtm.getNode(nodeHandle);
+ String nodeName = node.getNodeName();
+ try {
+ if (nodeName.startsWith("b_")) {
+ Integer int1 = Integer.valueOf(nodeName.substring(2));
+ Element elemNode = (Element)node;
+ xdmItem = new XString(elemNode.getTextContent());
+ }
+ else {
+ flg1 = true;
+ }
+ }
+ catch (Exception ex) {
+ flg1 = true;
+ }
+ }
+
+ if (flg1) {
+ xdmItem = rSeq.item(idx);
+ xdmItem = xdmItem.getFresh();
+ }
+ }
+
+ rSeq.set(idx, xdmItem);
+ }
+
+ result = rSeq;
+ }
+
return result;
}
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 df512425d..824f85ea8 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-10-08T11:07:17Z" fail="9" name="try" pass="27" skipped="6" statusUnknown="0" totalRun="36">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-10-09T12:05:32Z" fail="8" name="try" pass="28" skipped="6" statusUnknown="0" totalRun="36">
<testResult status="pass" testName="try-001"/>
<testResult status="pass" testName="try-002"/>
<testResult status="pass" testName="try-003"/>
@@ -17,7 +17,7 @@
<testResult status="pass" testName="try-016"/>
<testResult status="skipped" testName="try-017" xsltVersion="xslt 2.0 only"/>
<testResult status="pass" testName="try-018"/>
- <testResult status="fail" testName="try-019"/>
+ <testResult status="pass" testName="try-019"/>
<testResult status="pass" testName="try-020"/>
<testResult status="fail" testName="try-021">
<outResult/>
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 9eaf38b13..a5e639743 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-10-08T11:08:54Z" desc="W3C XSLT 3.0 test suite results" fail="673" pass="1738" skipped="71" success="71.61%" totalRun="2427" xslt_processor="Xalan-J XSLT 3.0 development code">
+<testResult dateTime="2025-10-09T12:06:12Z" desc="W3C XSLT 3.0 test suite results" fail="672" pass="1739" skipped="71" success="71.65%" totalRun="2427" 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"/>
@@ -45,7 +45,7 @@
<iterate fail="0" pass="44" skipped="0" success="100.0%" totalRun="44"/>
<sequence fail="17" pass="8" skipped="1" success="30.77%" totalRun="26"/>
<sort fail="30" pass="51" skipped="0" success="62.96%" totalRun="81"/>
- <try fail="9" pass="27" skipped="6" success="75.0%" totalRun="36"/>
+ <try fail="8" pass="28" skipped="6" success="77.78%" totalRun="36"/>
<xsl-document fail="13" pass="12" skipped="0" success="48.0%" totalRun="25"/>
</insn>
<misc>
diff --git a/src/test/java/org/apache/xalan/tests/xpath3/XPathStringConcatExprTests.java b/src/test/java/org/apache/xalan/tests/xpath3/XPathStringConcatExprTests.java
index 89a2246b8..4a3f9c15c 100644
--- a/src/test/java/org/apache/xalan/tests/xpath3/XPathStringConcatExprTests.java
+++ b/src/test/java/org/apache/xalan/tests/xpath3/XPathStringConcatExprTests.java
@@ -103,5 +103,17 @@ public class XPathStringConcatExprTests extends XslTransformTestsUtil {
runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
}
+
+ @Test
+ public void xslStringConcatExprTest6() {
+ String xmlFilePath = null;
+ String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test6.xsl";
+
+ String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test6.out";
+
+ m_initTemplateName = "main";
+
+ runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
+ }
}
diff --git a/src/test/resources/stringConcatExpr/gold/test6.out b/src/test/resources/stringConcatExpr/gold/test6.out
new file mode 100644
index 000000000..a714222fc
--- /dev/null
+++ b/src/test/resources/stringConcatExpr/gold/test6.out
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?><result>
+ <m1>#abc,pqr#</m1>
+ <m2>abcpqrabc</m2>
+ <n1>pqrabcpqr</n1>
+ <n2>#abc#</n2>
+ <p1>abcpqr</p1>
+ <p2>abcpqr</p2>
+</result>
diff --git a/src/test/resources/stringConcatExpr/test6.xsl b/src/test/resources/stringConcatExpr/test6.xsl
new file mode 100644
index 000000000..223eb63b1
--- /dev/null
+++ b/src/test/resources/stringConcatExpr/test6.xsl
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="3.0">
+
+ <!-- Author: mukulg@apache.org -->
+
+ <!-- An XSL stylesheet test case, to test XPath 3.1 string
+ concatenation operator "||". -->
+
+ <xsl:output method="xml" indent="yes"/>
+
+ <xsl:template name="main">
+ <result>
+ <xsl:variable name="a1" select="'abc'"/>
+ <xsl:variable name="a2" select="'pqr'"/>
+ <m1><xsl:value-of select="'#'||$a1"/>,<xsl:value-of select="$a2||'#'"/></m1>
+ <m2><xsl:value-of select="$a1||$a2||$a1"/></m2>
+ <n1><xsl:value-of select="$a2||$a1||$a2"/></n1>
+ <n2><xsl:value-of select="'#'||$a1||'#'"/></n2>
+ <p1><xsl:value-of select="$a1 ||$a2"/></p1>
+ <p2><xsl:value-of select="$a1|| $a2"/></p2>
+ </result>
+ </xsl:template>
+
+ <!--
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ -->
+
+</xsl:stylesheet>
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xalan.apache.org
For additional commands, e-mail: commits-help@xalan.apache.org