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