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/31 12:17:24 UTC

(xalan-java) branch xalan-j_xslt3.0_mvn updated: committing xalan-j implementation improvements for w3c xslt 3.0 test set attr\as

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 83fedbe33 committing xalan-j implementation improvements for w3c xslt 3.0 test set attr\as
83fedbe33 is described below

commit 83fedbe334f4a99d0b3b7aacf5699932238c8caa
Author: Mukul Gandhi <ga...@gmail.com>
AuthorDate: Fri Oct 31 17:47:09 2025 +0530

    committing xalan-j implementation improvements for w3c xslt 3.0 test set attr\as
---
 .../apache/xalan/serialize/SerializerUtils.java    |  16 +-
 .../apache/xalan/templates/ElemApplyTemplates.java | 283 +++++++++++----------
 .../org/apache/xalan/templates/ElemFunction.java   |  61 ++++-
 .../org/apache/xalan/templates/ElemSequence.java   |   4 +-
 .../org/apache/xml/serializer/ToXMLSAXHandler.java |   7 +-
 .../xpath/composite/SequenceTypeSupport.java       |  56 +++-
 .../org/apache/xpath/objects/XdmAttributeItem.java |  86 +++++++
 .../org/apache/xpath/operations/InstanceOf.java    | 128 +++++++---
 .../w3c/xslt3/result/attr/_as-test-set_result.xml  |   6 +-
 .../result/w3c_xslt3_testsuite_xalan-j_result.xml  |   4 +-
 10 files changed, 454 insertions(+), 197 deletions(-)

diff --git a/src/main/java/org/apache/xalan/serialize/SerializerUtils.java b/src/main/java/org/apache/xalan/serialize/SerializerUtils.java
index 494106656..32d3269d8 100644
--- a/src/main/java/org/apache/xalan/serialize/SerializerUtils.java
+++ b/src/main/java/org/apache/xalan/serialize/SerializerUtils.java
@@ -15,11 +15,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-/*
- * $Id$
- */
 package org.apache.xalan.serialize;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import javax.xml.transform.TransformerException;
 
 import org.apache.xalan.transformer.TransformerImpl;
@@ -29,6 +29,7 @@ import org.apache.xml.serializer.SerializationHandler;
 import org.apache.xml.utils.XMLString;
 import org.apache.xpath.XPathContext;
 import org.apache.xpath.objects.XObject;
+import org.apache.xpath.objects.XdmAttributeItem;
 import org.xml.sax.SAXException;
 
 /**
@@ -41,6 +42,15 @@ import org.xml.sax.SAXException;
  */
 public class SerializerUtils
 {
+	
+	/**
+	 * Class field, representing a list of xdm attribute items.
+	 * 
+	 * This list stores xdm attribute items, that're not serialized
+	 * but are emitted during an XSL transformation and may need to
+	 * be checked with an XPath sequence type.
+	 */
+	public static List<XdmAttributeItem> m_xdmAttrList = new ArrayList<XdmAttributeItem>();
 
     /**
      * Copy an DOM attribute to the created output element, executing
diff --git a/src/main/java/org/apache/xalan/templates/ElemApplyTemplates.java b/src/main/java/org/apache/xalan/templates/ElemApplyTemplates.java
index 60987cc58..247491d26 100644
--- a/src/main/java/org/apache/xalan/templates/ElemApplyTemplates.java
+++ b/src/main/java/org/apache/xalan/templates/ElemApplyTemplates.java
@@ -1286,7 +1286,7 @@ public class ElemApplyTemplates extends ElemCallTemplate
    * an xdm atomic value.
    */
   private void xslApplyTemplatesXdmAtomicValue(TransformerImpl transformer, XPathContext xctxt, XObject contextItem,
-		  									Set hashTableEntrySet, QName xslTemplateInvokeMode) throws TransformerException {
+		  									   Set hashTableEntrySet, QName xslTemplateInvokeMode) throws TransformerException {
 	  
 	  Iterator iter = hashTableEntrySet.iterator();	  
 	  
@@ -1295,152 +1295,157 @@ public class ElemApplyTemplates extends ElemCallTemplate
 	  SourceLocator srcLocator = xctxt.getSAXLocator();	  
 	  
 	  XObject prevCtxItem = xctxt.getXPath3ContextItem();
+	  int prevContextPos = xctxt.getXPath3ContextPosition();
+	  int prevContextSize = xctxt.getXPath3ContextSize();
 	  
-	  xctxt.setXPath3ContextItem(contextItem);
-	  
-	  // A list of TemplateDefnPriorityPair object instances, is needed to sort 
-	  // ElemTemplate object instances according to numeric priority (if this priority 
-	  // is not specified within an XSL stylesheet, then its value is 
-	  // java double -Infinity which is the min value of java double as 
-	  // provided by JDK).  
-	  List<TemplateDefnPriorityPair> templateDefnPriorityPairList = new ArrayList<TemplateDefnPriorityPair>();
-	  
-	  // This while loop finds an ElemTemplate object instance, that will be
-	  // used to do an XSL transformation of an XPath data model (xdm) atomic 
-	  // value (e.g, xs:string, xs:integer etc) that has been provided as an 
-	  // argument to this method.
-	  
-	  // An xsl:template instance selected for this purpose, is chosen 
-	  // according to xsl:template's mode and priority. At run-time, an 
-	  // xsl:template instance will always have priority value (which will be 
-	  // java lang double -Infinity value if not specified within an 
-	  // XSL stylesheet. Otherwise, xsl:template's priority shall be an xs:decimal 
-	  // finite numeric value). At run-time, an xsl:template's mode will 
-	  // be null when not specified with an XML attribute named 'mode', otherwise 
-	  // xsl:template's mode will be an XML QName typed non-null value.
-	  
-	  boolean templateSelectedWithoutPriority = false;
-	  
-	  while (iter.hasNext()) {
-		  Entry<Object, Object> hashTableEntry = (Entry<Object, Object>)iter.next();
-		  Object hashTableKeyObj = hashTableEntry.getKey();
-		  TemplateSubPatternAssociation hashTableValueObj = (TemplateSubPatternAssociation)(hashTableEntry.getValue());		
-		  elemTemplate = hashTableValueObj.getTemplate();
-		  
-		  QName templateDefnMode = elemTemplate.getMode();		  		   		   
-		  
-		  if ((xslTemplateInvokeMode != null) && (templateDefnMode != null)) {
-			 if (xslTemplateInvokeMode.equals(templateDefnMode)) {			  
-				templateSelectedWithoutPriority = true;
-			 }
-		  }
-		  else if ((xslTemplateInvokeMode != null) && (templateDefnMode == null)) {
-			 templateSelectedWithoutPriority = false; 
-		  }
-		  else if ((xslTemplateInvokeMode == null) && (templateDefnMode != null)) {
-			 templateSelectedWithoutPriority = false; 
-		  }
-		  else {
-			 templateSelectedWithoutPriority = true; 
-		  }
-		  
-		  if (!templateSelectedWithoutPriority) {
-			 continue;  
-		  }
-		  
-		  String keyValueStr = (String)hashTableKeyObj;	  
-		  String[] strArray1 = keyValueStr.split(Constants.XSL_PATTERN_TABLE_DELIM);
-		  if (keyValueStr.startsWith(".[") && (strArray1.length == 3)) {
-			  String xslTemplatePriorityStr = strArray1[2];			  
-			  String xpathStr = keyValueStr.substring(0, keyValueStr.indexOf(Constants.XSL_PATTERN_TABLE_DELIM));
-			  xpathStr = xpathStr.substring(2);
-			  xpathStr = xpathStr.substring(0, xpathStr.length() - 1);
-			  
-			  XPath xpath = new XPath(xpathStr, srcLocator, xctxt.getNamespaceContext(), 
-					  															XPath.SELECT, null);						
-			  XObject xpathEvalResult = xpath.execute(xctxt, DTM.NULL, xctxt.getNamespaceContext());						
-			  if (xpathEvalResult instanceof XBooleanStatic) {
-				  XBooleanStatic xBoolStatic = (XBooleanStatic)xpathEvalResult;
-				  templateSelectedWithoutPriority = xBoolStatic.bool(); 
-			  }
-			  else if (xpathEvalResult instanceof XBoolean) {
-				  XBoolean xBoolean = (XBoolean)xpathEvalResult;
-				  templateSelectedWithoutPriority = xBoolean.bool(); 
-			  }
-			  else if (xpathEvalResult instanceof XSBoolean) {
-				  XSBoolean xsBoolean = (XSBoolean)xpathEvalResult;
-				  templateSelectedWithoutPriority = xsBoolean.bool();
-			  }
-			  
-			  if (templateSelectedWithoutPriority) {
-			     TemplateDefnPriorityPair templateDefnPriorityPair = new TemplateDefnPriorityPair(keyValueStr, elemTemplate, 
-                      																					(Double.valueOf(xslTemplatePriorityStr)).doubleValue());
-			     templateDefnPriorityPairList.add(templateDefnPriorityPair);
-			  }
-		  }
-		  
-	  } // while (iter.hasNext())
-	  
-	  if (templateDefnPriorityPairList.size() == 0) {		  
-		  // Reset iterator
-		  iter = hashTableEntrySet.iterator();
-		  
+	  try {
+		  xctxt.setXPath3ContextItem(contextItem);
+
+		  // A list of TemplateDefnPriorityPair object instances, is needed to sort 
+		  // ElemTemplate object instances according to numeric priority (if this priority 
+		  // is not specified within an XSL stylesheet, then its value is 
+		  // java double -Infinity which is the min value of java double as 
+		  // provided by JDK).  
+		  List<TemplateDefnPriorityPair> templateDefnPriorityPairList = new ArrayList<TemplateDefnPriorityPair>();
+
+		  // This while loop finds an ElemTemplate object instance, that will be
+		  // used to do an XSL transformation of an XPath data model (xdm) atomic 
+		  // value (e.g, xs:string, xs:integer etc) that has been provided as an 
+		  // argument to this method.
+
+		  // An xsl:template instance selected for this purpose, is chosen 
+		  // according to xsl:template's mode and priority. At run-time, an 
+		  // xsl:template instance will always have priority value (which will be 
+		  // java lang double -Infinity value if not specified within an 
+		  // XSL stylesheet. Otherwise, xsl:template's priority shall be an xs:decimal 
+		  // finite numeric value). At run-time, an xsl:template's mode will 
+		  // be null when not specified with an XML attribute named 'mode', otherwise 
+		  // xsl:template's mode will be an XML QName typed non-null value.
+
+		  boolean templateSelectedWithoutPriority = false;
+
 		  while (iter.hasNext()) {
 			  Entry<Object, Object> hashTableEntry = (Entry<Object, Object>)iter.next();
 			  Object hashTableKeyObj = hashTableEntry.getKey();
 			  TemplateSubPatternAssociation hashTableValueObj = (TemplateSubPatternAssociation)(hashTableEntry.getValue());		
 			  elemTemplate = hashTableValueObj.getTemplate();
-			  
+
 			  QName templateDefnMode = elemTemplate.getMode();		  		   		   
-			  
+
 			  if ((xslTemplateInvokeMode != null) && (templateDefnMode != null)) {
-				 if (xslTemplateInvokeMode.equals(templateDefnMode)) {			  
-					templateSelectedWithoutPriority = true;
-				 }
+				  if (xslTemplateInvokeMode.equals(templateDefnMode)) {			  
+					  templateSelectedWithoutPriority = true;
+				  }
 			  }
 			  else if ((xslTemplateInvokeMode != null) && (templateDefnMode == null)) {
-				 templateSelectedWithoutPriority = false; 
+				  templateSelectedWithoutPriority = false; 
 			  }
 			  else if ((xslTemplateInvokeMode == null) && (templateDefnMode != null)) {
-				 templateSelectedWithoutPriority = false; 
+				  templateSelectedWithoutPriority = false; 
 			  }
 			  else {
-				 templateSelectedWithoutPriority = true; 
+				  templateSelectedWithoutPriority = true; 
 			  }
-			  
+
 			  if (!templateSelectedWithoutPriority) {
-				 continue;  
+				  continue;  
 			  }
-			  
-			  String keyValueStr = (String)hashTableKeyObj;			  
+
+			  String keyValueStr = (String)hashTableKeyObj;	  
 			  String[] strArray1 = keyValueStr.split(Constants.XSL_PATTERN_TABLE_DELIM);
-			  if (".".equals(strArray1[0]) && (strArray1.length == 3)) {
-				 String xslTemplatePriorityStr = strArray1[2];
-				 TemplateDefnPriorityPair templateDefnPriorityPair = new TemplateDefnPriorityPair(keyValueStr, elemTemplate, 
-	                   																					(Double.valueOf(xslTemplatePriorityStr)).doubleValue());
-				 templateDefnPriorityPairList.add(templateDefnPriorityPair);
-				  
+			  if (keyValueStr.startsWith(".[") && (strArray1.length == 3)) {
+				  String xslTemplatePriorityStr = strArray1[2];			  
+				  String xpathStr = keyValueStr.substring(0, keyValueStr.indexOf(Constants.XSL_PATTERN_TABLE_DELIM));
+				  xpathStr = xpathStr.substring(2);
+				  xpathStr = xpathStr.substring(0, xpathStr.length() - 1);
+
+				  XPath xpath = new XPath(xpathStr, srcLocator, xctxt.getNamespaceContext(), XPath.SELECT, null);						
+				  XObject xpathEvalResult = xpath.execute(xctxt, DTM.NULL, xctxt.getNamespaceContext());						
+				  if (xpathEvalResult instanceof XBooleanStatic) {
+					  XBooleanStatic xBoolStatic = (XBooleanStatic)xpathEvalResult;
+					  templateSelectedWithoutPriority = xBoolStatic.bool(); 
+				  }
+				  else if (xpathEvalResult instanceof XBoolean) {
+					  XBoolean xBoolean = (XBoolean)xpathEvalResult;
+					  templateSelectedWithoutPriority = xBoolean.bool(); 
+				  }
+				  else if (xpathEvalResult instanceof XSBoolean) {
+					  XSBoolean xsBoolean = (XSBoolean)xpathEvalResult;
+					  templateSelectedWithoutPriority = xsBoolean.bool();
+				  }
+
+				  if (templateSelectedWithoutPriority) {
+					  TemplateDefnPriorityPair templateDefnPriorityPair = new TemplateDefnPriorityPair(keyValueStr, elemTemplate, 
+							                                                                                    (Double.valueOf(xslTemplatePriorityStr)).doubleValue());
+					  templateDefnPriorityPairList.add(templateDefnPriorityPair);
+				  }
 			  }
-			  
+
 		  } // while (iter.hasNext())
-	  }
 
-	  templateDefnPriorityPairList.sort(null);
+		  if (templateDefnPriorityPairList.size() == 0) {		  
+			  // Reset iterator
+			  iter = hashTableEntrySet.iterator();
 
-	  TemplateDefnPriorityPair templateDefnPriorityPair = templateDefnPriorityPairList.get(
-				  																		templateDefnPriorityPairList.size() - 1);
-	  
-	  elemTemplate = templateDefnPriorityPair.getElemTemplate();
-						 						  		 
-	  for (ElemTemplateElement t = elemTemplate.m_firstChild; 
-			  												t != null; t = t.m_nextSibling) {
-		  xctxt.setSAXLocator(t);
-		  transformer.pushElemTemplateElement(t);    		   
-		  t.execute(transformer);
-		  transformer.popElemTemplateElement();
-	  }
-	  
-	  xctxt.setXPath3ContextItem(prevCtxItem);
+			  while (iter.hasNext()) {
+				  Entry<Object, Object> hashTableEntry = (Entry<Object, Object>)iter.next();
+				  Object hashTableKeyObj = hashTableEntry.getKey();
+				  TemplateSubPatternAssociation hashTableValueObj = (TemplateSubPatternAssociation)(hashTableEntry.getValue());		
+				  elemTemplate = hashTableValueObj.getTemplate();
+
+				  QName templateDefnMode = elemTemplate.getMode();		  		   		   
+
+				  if ((xslTemplateInvokeMode != null) && (templateDefnMode != null)) {
+					  if (xslTemplateInvokeMode.equals(templateDefnMode)) {			  
+						  templateSelectedWithoutPriority = true;
+					  }
+				  }
+				  else if ((xslTemplateInvokeMode != null) && (templateDefnMode == null)) {
+					  templateSelectedWithoutPriority = false; 
+				  }
+				  else if ((xslTemplateInvokeMode == null) && (templateDefnMode != null)) {
+					  templateSelectedWithoutPriority = false; 
+				  }
+				  else {
+					  templateSelectedWithoutPriority = true; 
+				  }
+
+				  if (!templateSelectedWithoutPriority) {
+					  continue;  
+				  }
+
+				  String keyValueStr = (String)hashTableKeyObj;			  
+				  String[] strArray1 = keyValueStr.split(Constants.XSL_PATTERN_TABLE_DELIM);
+				  if (".".equals(strArray1[0]) && (strArray1.length == 3)) {
+					  String xslTemplatePriorityStr = strArray1[2];
+					  TemplateDefnPriorityPair templateDefnPriorityPair = new TemplateDefnPriorityPair(keyValueStr, elemTemplate, 
+							                                                                                     (Double.valueOf(xslTemplatePriorityStr)).doubleValue());
+					  templateDefnPriorityPairList.add(templateDefnPriorityPair);
+
+				  }
+
+			  } // while (iter.hasNext())
+		  }
+
+		  templateDefnPriorityPairList.sort(null);
+
+		  TemplateDefnPriorityPair templateDefnPriorityPair = templateDefnPriorityPairList.get(templateDefnPriorityPairList.size() - 1);
+
+		  elemTemplate = templateDefnPriorityPair.getElemTemplate();
+
+		  for (ElemTemplateElement t1 = elemTemplate.m_firstChild; t1 != null; 
+				                                                           t1 = t1.m_nextSibling) {
+			  xctxt.setSAXLocator(t1);
+			  transformer.pushElemTemplateElement(t1);    		   
+			  t1.execute(transformer);
+			  transformer.popElemTemplateElement();
+		  }
+      }
+      finally {
+	     xctxt.setXPath3ContextItem(prevCtxItem);
+	     xctxt.setXPath3ContextPosition(prevContextPos);
+	     xctxt.setXPath3ContextSize(prevContextSize);
+      }
   }
 
   /**
@@ -1508,11 +1513,11 @@ public class ElemApplyTemplates extends ElemCallTemplate
    */
   class TemplateDefnPriorityPair implements Comparable<TemplateDefnPriorityPair> {
 	  
-	  private String keyValueStr = null;
+	  private String m_keyValueStr = null;
 	  
-	  private ElemTemplate elemTemplate = null;
+	  private ElemTemplate m_elemTemplate = null;
 	  
-	  private double priority;
+	  private double m_priority;
 	  
 	  /**
 	   * Default constructor.
@@ -1525,43 +1530,43 @@ public class ElemApplyTemplates extends ElemCallTemplate
 	   * Class constructor.
 	   */
 	  public TemplateDefnPriorityPair(String keyValueStr, ElemTemplate elemTemplate, double priority) {
-		 this.keyValueStr = keyValueStr;
-		 this.elemTemplate = elemTemplate;
-		 this.priority = priority;
+		 this.m_keyValueStr = keyValueStr;
+		 this.m_elemTemplate = elemTemplate;
+		 this.m_priority = priority;
 	  }
 
 	  public ElemTemplate getElemTemplate() {
-		  return elemTemplate;
+		  return m_elemTemplate;
 	  }
 
 	  public void setElemTemplate(ElemTemplate elemTemplate) {
-		  this.elemTemplate = elemTemplate;
+		  this.m_elemTemplate = elemTemplate;
 	  }
 
 	  public String getKeyValueStr() {
-		  return keyValueStr;
+		  return m_keyValueStr;
 	  }
 
 	  public void setKeyValueStr(String keyValueStr) {
-		  this.keyValueStr = keyValueStr;
+		  this.m_keyValueStr = keyValueStr;
 	  }
 
 	  public double getPriority() {
-		  return priority;
+		  return m_priority;
 	  }
 
 	  public void setPriority(double priority) {
-		  this.priority = priority;
+		  this.m_priority = priority;
 	  }
 
 	  @Override
 	  public int compareTo(TemplateDefnPriorityPair obj1) {
 		 int result = 0;
 		 
-		 if (this.priority < obj1.getPriority()) {
+		 if (this.m_priority < obj1.getPriority()) {
 			result = -1; 
 		 }
-		 else if (this.priority > obj1.getPriority()) {
+		 else if (this.m_priority > obj1.getPriority()) {
 			result = 1;  
 		 }
 		 
diff --git a/src/main/java/org/apache/xalan/templates/ElemFunction.java b/src/main/java/org/apache/xalan/templates/ElemFunction.java
index 400ad8a16..0d91acc0f 100644
--- a/src/main/java/org/apache/xalan/templates/ElemFunction.java
+++ b/src/main/java/org/apache/xalan/templates/ElemFunction.java
@@ -28,6 +28,7 @@ import javax.xml.XMLConstants;
 import javax.xml.transform.SourceLocator;
 import javax.xml.transform.TransformerException;
 
+import org.apache.xalan.serialize.SerializerUtils;
 import org.apache.xalan.transformer.TransformerImpl;
 import org.apache.xalan.xslt.util.XslTransformData;
 import org.apache.xalan.xslt.util.XslTransformEvaluationHelper;
@@ -540,6 +541,9 @@ public class ElemFunction extends ElemTemplate
     	  try {
     		SequenceTypeData seqExpectedTypeData = SequenceTypeSupport.getSequenceTypeDataFromSeqTypeStr(funcAsAttrStrVal, xctxt, srcLocator);
     		
+    		SequenceTypeKindTest seqTypeKindTest = seqExpectedTypeData.getSequenceTypeKindTest();
+    		int seqTypeItemOccrIndicator = seqExpectedTypeData.getItemTypeOccurrenceIndicator();
+    		
     	    if (isOnlyElemTextLiteral) {    	    	
     		    funcResultConvertedVal = new XSString((XslTransformEvaluationHelper.getStrVal(funcResultConvertedVal)).trim());
     		    
@@ -551,17 +555,24 @@ public class ElemFunction extends ElemTemplate
     		       (funcMemoization.func_result_cache).add(funcMemoization);
     		    }
     		    
+    		    if (SerializerUtils.m_xdmAttrList.size() > 0) {
+    		       SerializerUtils.m_xdmAttrList.clear();
+    		    }
+    		    
     		    return funcResultConvertedVal;
     	    }    	          	         	 
         	 
              if (funcResultConvertedVal instanceof XPathInlineFunction) {
-            	SequenceTypeKindTest seqTypeKindTest = seqExpectedTypeData.getSequenceTypeKindTest();
             	if ((seqTypeKindTest != null) && (seqTypeKindTest.getKindVal() == SequenceTypeSupport.ITEM_KIND)) {
             		if (m_cache) {
          		       XslFunctionMemoization funcMemoization = new XslFunctionMemoization(m_name, argList, funcResultConvertedVal, this);
          		       (funcMemoization.func_result_cache).add(funcMemoization);
          		    }
             		
+            		if (SerializerUtils.m_xdmAttrList.size() > 0) {
+         		       SerializerUtils.m_xdmAttrList.clear();
+         		    }
+            		
             	    return funcResultConvertedVal;
             	}
             	
@@ -570,6 +581,10 @@ public class ElemFunction extends ElemTemplate
             			XslFunctionMemoization funcMemoization = new XslFunctionMemoization(m_name, argList, funcResultConvertedVal, this);
             			(funcMemoization.func_result_cache).add(funcMemoization);
             		}
+            		
+            		if (SerializerUtils.m_xdmAttrList.size() > 0) {
+         		       SerializerUtils.m_xdmAttrList.clear();
+         		    }
 
             		return funcResultConvertedVal;
             	}
@@ -580,12 +595,15 @@ public class ElemFunction extends ElemTemplate
             	}
              }
              else if ((funcResultConvertedVal instanceof XPathMap) || (funcResultConvertedVal instanceof XPathArray)) {
-            	 SequenceTypeKindTest seqTypeKindTest = seqExpectedTypeData.getSequenceTypeKindTest();
             	 if ((seqTypeKindTest != null) && (seqTypeKindTest.getKindVal() == SequenceTypeSupport.ITEM_KIND)) {
             		 if (m_cache) {
             			 XslFunctionMemoization funcMemoization = new XslFunctionMemoization(m_name, argList, funcResultConvertedVal, this);
             			 (funcMemoization.func_result_cache).add(funcMemoization);
             		 }
+            		 
+            		 if (SerializerUtils.m_xdmAttrList.size() > 0) {
+          		        SerializerUtils.m_xdmAttrList.clear();
+          		     }
 
             		 return funcResultConvertedVal;
             	 }
@@ -597,6 +615,10 @@ public class ElemFunction extends ElemTemplate
             			 XslFunctionMemoization funcMemoization = new XslFunctionMemoization(m_name, argList, funcResultConvertedVal, this);
             			 (funcMemoization.func_result_cache).add(funcMemoization);
             		 }
+            		 
+            		 if (SerializerUtils.m_xdmAttrList.size() > 0) {
+          		        SerializerUtils.m_xdmAttrList.clear();
+          		     }
 
             		 return funcResultConvertedVal;
             	 }
@@ -609,23 +631,22 @@ public class ElemFunction extends ElemTemplate
              else if (((XslTransformData.m_xpathNamedFunctionRefSequence).size() > 0) && !ElemVariable.m_isXPathNamedFunctionRefSequenceVar) {            
             	int funcItemSeqSize = (XslTransformData.m_xpathNamedFunctionRefSequence).size();
         		
-        		SequenceTypeFunctionTest sequenceTypeFunctionTest = seqExpectedTypeData.getSequenceTypeFunctionTest();
-        		int seqTypeItemOccurenceIndicator = seqExpectedTypeData.getItemTypeOccurrenceIndicator();
+        		SequenceTypeFunctionTest sequenceTypeFunctionTest = seqExpectedTypeData.getSequenceTypeFunctionTest();        		
         		boolean isSeqCardinalityOk = false;
-        		if ((funcItemSeqSize == 0) && ((seqTypeItemOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY) || 
-        				                       (seqTypeItemOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_ONE))) {
+        		if ((funcItemSeqSize == 0) && ((seqTypeItemOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY) || 
+        				                       (seqTypeItemOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_ONE))) {
         		   isSeqCardinalityOk = true;
         		}
-        		else if ((funcItemSeqSize == 1) && ((seqTypeItemOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ABSENT) || 
-        				                            (seqTypeItemOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY) || 
-        				                            (seqTypeItemOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ONE_OR_MANY) ||
-        				                            (seqTypeItemOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_ONE))) {
+        		else if ((funcItemSeqSize == 1) && ((seqTypeItemOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ABSENT) || 
+        				                            (seqTypeItemOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY) || 
+        				                            (seqTypeItemOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ONE_OR_MANY) ||
+        				                            (seqTypeItemOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_ONE))) {
         		   // An XPath sequence type occurrence indicator with value absent, or any 
         		   // other occurrence indicator is ok.
         		   isSeqCardinalityOk = true;
         		}
-        		else if ((seqTypeItemOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY) ||
-        				 (seqTypeItemOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ONE_OR_MANY)) {
+        		else if ((seqTypeItemOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY) ||
+        				 (seqTypeItemOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ONE_OR_MANY)) {
         		   // here, funcItemSeqSize > 1
         		   isSeqCardinalityOk = true;
         		}
@@ -651,6 +672,10 @@ public class ElemFunction extends ElemTemplate
         					XslFunctionMemoization funcMemoization = new XslFunctionMemoization(m_name, argList, funcResultConvertedVal, this);
         					(funcMemoization.func_result_cache).add(funcMemoization);
         				}
+        				
+        				if (SerializerUtils.m_xdmAttrList.size() > 0) {
+        	    		   SerializerUtils.m_xdmAttrList.clear();
+        	    		}
 
         				return funcResultConvertedVal;
         			}
@@ -690,6 +715,10 @@ public class ElemFunction extends ElemTemplate
         					XslFunctionMemoization funcMemoization = new XslFunctionMemoization(m_name, argList, funcResultConvertedVal, this);
         					(funcMemoization.func_result_cache).add(funcMemoization);
         				}
+        				
+        				if (SerializerUtils.m_xdmAttrList.size() > 0) {
+        	    		   SerializerUtils.m_xdmAttrList.clear();
+        	    		}
 
         				return funcResultConvertedVal;
         			}
@@ -701,8 +730,8 @@ public class ElemFunction extends ElemTemplate
              if (funcResultConvertedVal == null) {
                 funcResultConvertedVal = SequenceTypeSupport.castXdmValueToAnotherType(result, funcAsAttrStrVal, null, xctxt);                                
                 if (funcResultConvertedVal == null) {
-                   if ((seqExpectedTypeData.getItemTypeOccurrenceIndicator() == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY) || 
-                	   (seqExpectedTypeData.getItemTypeOccurrenceIndicator() == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_ONE)) {
+                   if ((seqTypeItemOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY) || 
+                	   (seqTypeItemOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_ONE)) {
                 	   funcResultConvertedVal = new ResultSequence();
                    }
                    else {
@@ -733,6 +762,10 @@ public class ElemFunction extends ElemTemplate
     	  (funcMemoization.func_result_cache).add(funcMemoization);
       }
       
+      if (SerializerUtils.m_xdmAttrList.size() > 0) {
+	     SerializerUtils.m_xdmAttrList.clear();
+	  }
+      
       return funcResultConvertedVal;
   }
 
diff --git a/src/main/java/org/apache/xalan/templates/ElemSequence.java b/src/main/java/org/apache/xalan/templates/ElemSequence.java
index ab554ba6f..83debbed3 100644
--- a/src/main/java/org/apache/xalan/templates/ElemSequence.java
+++ b/src/main/java/org/apache/xalan/templates/ElemSequence.java
@@ -116,6 +116,8 @@ public class ElemSequence extends ElemTemplateElement
    */
   private XPath m_selectPattern;
   
+  public static String SER_SUFFIX_ID = "XSL_SEQ";
+  
   /**
    * We use this string value constant to add as a suffix to, a string value that
    * is being serialized by Xalan-J serializer, when XSL serialization is
@@ -126,7 +128,7 @@ public class ElemSequence extends ElemTemplateElement
    * We're assuming that, this string value is significantly random, and is unlikely
    * to be present within an input document that is getting transformed.
    */
-  public static String STRING_VAL_SERIALIZATION_SUFFIX = "XSL_SEQ" + ElemCopyOf.SPACE_CHAR + "XSL_SEQ";
+  public static String STRING_VAL_SERIALIZATION_SUFFIX = SER_SUFFIX_ID + ElemCopyOf.SPACE_CHAR + SER_SUFFIX_ID;
 
   /**
    * Set the value of "select" attribute.
diff --git a/src/main/java/org/apache/xml/serializer/ToXMLSAXHandler.java b/src/main/java/org/apache/xml/serializer/ToXMLSAXHandler.java
index 56b440f46..1c04d54ca 100644
--- a/src/main/java/org/apache/xml/serializer/ToXMLSAXHandler.java
+++ b/src/main/java/org/apache/xml/serializer/ToXMLSAXHandler.java
@@ -27,7 +27,9 @@ import java.util.Properties;
 
 import javax.xml.transform.Result;
 
+import org.apache.xalan.serialize.SerializerUtils;
 import org.apache.xml.utils.DOMBuilder;
+import org.apache.xpath.objects.XdmAttributeItem;
 import org.w3c.dom.Node;
 import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
@@ -750,7 +752,10 @@ public final class ToXMLSAXHandler extends ToSAXHandler
             ensurePrefixIsDeclared(uri, rawName);
             addAttributeAlways(uri, localName, rawName, type, value, false);
         }
-
+        else {        	
+        	XdmAttributeItem xdmAttributeItem = new XdmAttributeItem(localName, uri, value);
+        	SerializerUtils.m_xdmAttrList.add(xdmAttributeItem);
+        }
     } 
        
     /**
diff --git a/src/main/java/org/apache/xpath/composite/SequenceTypeSupport.java b/src/main/java/org/apache/xpath/composite/SequenceTypeSupport.java
index 71b5a6056..3f04d57c1 100644
--- a/src/main/java/org/apache/xpath/composite/SequenceTypeSupport.java
+++ b/src/main/java/org/apache/xpath/composite/SequenceTypeSupport.java
@@ -35,6 +35,7 @@ import javax.xml.transform.dom.DOMSource;
 import javax.xml.validation.Schema;
 import javax.xml.validation.Validator;
 
+import org.apache.xalan.serialize.SerializerUtils;
 import org.apache.xalan.templates.ElemSequence;
 import org.apache.xalan.templates.StylesheetRoot;
 import org.apache.xalan.templates.XMLNSDecl;
@@ -70,6 +71,7 @@ import org.apache.xpath.objects.XPathArray;
 import org.apache.xpath.objects.XPathInlineFunction;
 import org.apache.xpath.objects.XPathMap;
 import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XdmAttributeItem;
 import org.apache.xpath.types.XSBase64Binary;
 import org.apache.xpath.types.XSByte;
 import org.apache.xpath.types.XSGDay;
@@ -1893,8 +1895,60 @@ public class SequenceTypeSupport {
         List<Integer> xdmNodesDtmList = new ArrayList<Integer>();
 
         Node localRootNode = dtmNodeList.item(0);
+        
         NodeList nodeList = localRootNode.getChildNodes();
-        int nodeSetLen = nodeList.getLength();
+        int nodeSetLen = nodeList.getLength();        
+        
+        final int contextNode = xctxt.getCurrentNode();         
+                
+        int attrCount = SerializerUtils.m_xdmAttrList.size();
+        if ((nodeSetLen == 0) && (attrCount > 0)) {        	        	
+        	XPath seqTypeXPath = null;
+            XObject seqTypeExpressionEvalResult = null;
+            SequenceTypeData seqExpectedTypeData = null;
+            
+            if ((xctxt != null) && (sequenceTypeXPathExprStr != null) && (seqExpectedTypeDataInp == null)) {
+            	seqTypeXPath = new XPath(sequenceTypeXPathExprStr, srcLocator, xctxt.getNamespaceContext(), 
+            			                                                                          XPath.SELECT, null, true);            
+            	seqTypeExpressionEvalResult = seqTypeXPath.execute(xctxt, contextNode, xctxt.getNamespaceContext());            
+            	seqExpectedTypeData = (SequenceTypeData)seqTypeExpressionEvalResult;            	
+            	SequenceTypeKindTest sequenceTypeKindTest2 = seqExpectedTypeData.getSequenceTypeKindTest();
+            	boolean isXdmValueMatchesType = false;
+            	if ((sequenceTypeKindTest2 != null) && (sequenceTypeKindTest2.getKindVal() == SequenceTypeSupport.ATTRIBUTE_KIND) ||
+            			                               (sequenceTypeKindTest2.getKindVal() == SequenceTypeSupport.ITEM_KIND)) {
+            		int seqTypeOccrIndicator = seqExpectedTypeData.getItemTypeOccurrenceIndicator();
+            		if ((attrCount == 1) && (seqTypeOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ABSENT)) {
+            			isXdmValueMatchesType = true;
+            		}
+            		else if ((attrCount >= 1) && (seqTypeOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ONE_OR_MANY)) {
+            			isXdmValueMatchesType = true;
+            		}
+                    else if ((attrCount >= 0) && (seqTypeOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY)) {
+                    	isXdmValueMatchesType = true;
+            		}
+                    else if (((attrCount == 0) || (attrCount == 1)) && (seqTypeOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_ONE)) {
+                    	isXdmValueMatchesType = true;
+            		}
+            	}
+            	
+            	if (isXdmValueMatchesType) {
+            	   ResultSequence rSeq = new ResultSequence();
+            	   List<XdmAttributeItem> xdmAttrList = SerializerUtils.m_xdmAttrList;
+            	   for (int idx = 0; idx < attrCount; idx++) {
+            		  XdmAttributeItem xdmAttributeItem = xdmAttrList.get(idx);
+            		  rSeq.add(xdmAttributeItem);
+            	   }
+            	   
+            	   result = rSeq;
+            	   
+            	   return result; 
+            	}
+            	else {
+            	   throw new TransformerException("XPTY0004 : A sequence of xdm attribute items, doesn't match XPath "
+                                                                                                       + "sequence type " + sequenceTypeXPathExprStr + ".", srcLocator);
+            	}
+            }
+        }
 
         ResultSequence convertedResultSeq = new ResultSequence();
         
diff --git a/src/main/java/org/apache/xpath/objects/XdmAttributeItem.java b/src/main/java/org/apache/xpath/objects/XdmAttributeItem.java
new file mode 100644
index 000000000..1bfe07459
--- /dev/null
+++ b/src/main/java/org/apache/xpath/objects/XdmAttributeItem.java
@@ -0,0 +1,86 @@
+/*
+ * 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.
+ */
+package org.apache.xpath.objects;
+
+/**
+ * Class definition, to represent an xdm attribute item.
+ * 
+ * @author Mukul Gandhi <mu...@apache.org>
+ * 
+ * @xsl.usage advanced
+ */
+public class XdmAttributeItem extends XObject {
+	
+	private static final long serialVersionUID = -1364342059577570615L;
+
+	/**
+	 * Class field, representing an XML attribute's 
+	 * local name. 
+	 */
+	private String m_attrLocalName = null;
+	
+	/**
+	 * Class field, representing an XML attribute's 
+	 * namespace. 
+	 */
+	private String m_attrNodeNs = null;
+	
+	/**
+	 * Class field, representing an XML attribute's 
+	 * string value. 
+	 */
+	private String m_attrStrValue = null;
+	
+	/**
+	 * Class constructor.
+	 * 
+	 * @param attrLocalName				An XML attribute's local name
+	 * @param attrNs                    An XML attribute's namespace
+	 * @param attrValue                 An XML attribute's string value
+	 */
+	public XdmAttributeItem(String attrLocalName, String attrNs, String attrValue) {
+		m_attrLocalName = attrLocalName;
+		m_attrNodeNs = attrNs;
+		m_attrStrValue = attrValue; 
+	}
+
+	public String getAttrLocalName() {
+		return m_attrLocalName;
+	}
+
+	public void setAttrLocalName(String attrLocalName) {
+		this.m_attrLocalName = attrLocalName;
+	}
+
+	public String getAttrNodeNs() {
+		return m_attrNodeNs;
+	}
+
+	public void setAttrNodeNs(String attrNodeNs) {
+		this.m_attrNodeNs = attrNodeNs;
+	}
+
+	public String getAttrStrValue() {
+		return m_attrStrValue;
+	}
+
+	public void setAttrStrValue(String attrStrValue) {
+		this.m_attrStrValue = attrStrValue;
+	}
+
+}
diff --git a/src/main/java/org/apache/xpath/operations/InstanceOf.java b/src/main/java/org/apache/xpath/operations/InstanceOf.java
index e98d1f245..087bd2c66 100644
--- a/src/main/java/org/apache/xpath/operations/InstanceOf.java
+++ b/src/main/java/org/apache/xpath/operations/InstanceOf.java
@@ -66,6 +66,7 @@ import org.apache.xpath.objects.XPathArray;
 import org.apache.xpath.objects.XPathInlineFunction;
 import org.apache.xpath.objects.XPathMap;
 import org.apache.xpath.objects.XString;
+import org.apache.xpath.objects.XdmAttributeItem;
 import org.apache.xpath.types.XMLAttribute;
 import org.apache.xpath.types.XSBase64Binary;
 import org.apache.xpath.types.XSByte;
@@ -141,13 +142,15 @@ public class InstanceOf extends Operation
   public XObject operate(XObject left, XObject right) 
                                                  throws javax.xml.transform.TransformerException
   {
-      boolean result = false;
+      boolean result = false;      
+            
+      XPathContext xctxt = null;      
       
       SequenceTypeData seqTypedData = (SequenceTypeData)right;
       
-      XPathContext xctxt = null;      
-      
-      int builtInSeqType = seqTypedData.getBuiltInSequenceType();
+      int builtInSeqType = seqTypedData.getBuiltInSequenceType();      
+      SequenceTypeKindTest sequenceTypeKindTest = seqTypedData.getSequenceTypeKindTest();
+      int seqTypeOccurenceIndicator = seqTypedData.getItemTypeOccurrenceIndicator();      
       
       if (left instanceof ElemFunctionItem) {
     	  /**
@@ -196,7 +199,16 @@ public class InstanceOf extends Operation
     	  XPath xpathObj = new XPath(xpathInlineFuncDefnStr, this, prefixResolver, XPath.SELECT, null);
     	  
     	  left = xpathObj.execute(xctxt, DTM.NULL, prefixResolver);
-      }      
+      }
+      else if (left instanceof XdmAttributeItem) {
+    	  if ((sequenceTypeKindTest != null) && (sequenceTypeKindTest.getKindVal() == SequenceTypeSupport.ATTRIBUTE_KIND) ||
+    			                                (sequenceTypeKindTest.getKindVal() == SequenceTypeSupport.ITEM_KIND)) {
+    		  return XBoolean.S_TRUE;
+    	  }
+    	  else {
+    		  return XBoolean.S_FALSE;
+    	  }
+      }
       
       if (left instanceof XSQName) {
     	 java.lang.String localPart = ((XSQName)left).getLocalPart();
@@ -205,16 +217,32 @@ public class InstanceOf extends Operation
     	 }
       }
       
-      if ((left instanceof ResultSequence) && ((ResultSequence)left).size() == 0) {    	 
-    	 if ((seqTypedData.getItemTypeOccurrenceIndicator() == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_ONE) || 
-    		                                          (seqTypedData.getItemTypeOccurrenceIndicator() == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY)) {
-    		 return XBoolean.S_TRUE; 
-    	 }
-    	 else if (builtInSeqType == SequenceTypeSupport.EMPTY_SEQUENCE) {
-    		 return XBoolean.S_TRUE;
-    	 }
-    	 else if (seqTypedData.getItemTypeOccurrenceIndicator() == SequenceTypeSupport.OccurrenceIndicator.ABSENT) {
-    		 return XBoolean.S_FALSE;
+      if (left instanceof ResultSequence) {
+    	 int rSeqLength = ((ResultSequence)left).size();    	 
+    	 if (rSeqLength == 0) {
+    		 if ((seqTypeOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_ONE) || 
+    				                                                                 (seqTypeOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY)) {
+    			 return XBoolean.S_TRUE; 
+    		 }
+    		 else if (builtInSeqType == SequenceTypeSupport.EMPTY_SEQUENCE) {
+    			 return XBoolean.S_TRUE;
+    		 }
+    		 else if (seqTypeOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ABSENT) {
+    			 return XBoolean.S_FALSE;
+    		 }
+         }
+    	 else if ((sequenceTypeKindTest != null) && (sequenceTypeKindTest.getKindVal() == SequenceTypeSupport.ITEM_KIND)) {
+    		 if (rSeqLength == 1) {
+    			 return XBoolean.S_TRUE;
+    		 }
+    		 else if ((seqTypeOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY) ||
+    				  (seqTypeOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ONE_OR_MANY)) {
+    			 // here, rSeqLength > 1
+    			 return XBoolean.S_TRUE; 
+    		 }
+    		 else {
+    			 return XBoolean.S_FALSE;  
+    		 }
     	 }
       }
       
@@ -240,14 +268,14 @@ public class InstanceOf extends Operation
     		if ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>".equals(xmlStr)) {
     			// XPath 'instance of' operator's LHS is an empty sequence    			
     			boolean isSequenceCardinalityOk = false;    			
-    			if ((seqTypedData.getItemTypeOccurrenceIndicator() == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_ONE) || 
-    				                                         (seqTypedData.getItemTypeOccurrenceIndicator() == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY)) {
+    			if ((seqTypeOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_ONE) || 
+    				                                                                  (seqTypeOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY)) {
     				isSequenceCardinalityOk = true; 
     			}
     			else if (builtInSeqType == SequenceTypeSupport.EMPTY_SEQUENCE) {
     				isSequenceCardinalityOk = true;
     			}
-    			else if (seqTypedData.getItemTypeOccurrenceIndicator() == SequenceTypeSupport.OccurrenceIndicator.ABSENT) {
+    			else if (seqTypeOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ABSENT) {
     				isSequenceCardinalityOk = false;
     			}    			
 
@@ -285,11 +313,13 @@ public class InstanceOf extends Operation
       
       SequenceTypeKindTest sequenceTypeKindTest = seqTypeData.getSequenceTypeKindTest();
       
+      final int seqTypeOccrIndicator = seqTypeData.getItemTypeOccurrenceIndicator();
+      
       boolean isXdmValueString = ((xdmValue instanceof XString) || (xdmValue instanceof XSString));  
       
       if (isXdmValueString && "".equals(XslTransformEvaluationHelper.getStrVal(xdmValue)) && ((sequenceTypeKindTest.getKindVal() == SequenceTypeSupport.DOCUMENT_KIND) && 
-    		                                                                                  ((seqTypeData.getItemTypeOccurrenceIndicator() == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_ONE) || 
-    		                                                                                   (seqTypeData.getItemTypeOccurrenceIndicator() == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY)))) {
+    		                                                                                  ((seqTypeOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_ONE) || 
+    		                                                                                   (seqTypeOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY)))) {
     	  isInstanceOf = true;
       }      
       else if ((xdmValue instanceof XSUntypedAtomic) && (seqTypeData.getBuiltInSequenceType() == SequenceTypeSupport.XS_UNTYPED_ATOMIC)) {
@@ -590,6 +620,27 @@ public class InstanceOf extends Operation
     		  }
     	  }
       }
+      else if (sequenceTypeKindTest.getKindVal() == SequenceTypeSupport.ITEM_KIND) {
+    	  if (xdmValue instanceof ResultSequence) {
+    		 ResultSequence rSeq = (ResultSequence)xdmValue;
+    		 int rSeqSize = rSeq.size();
+    		 if ((rSeqSize == 0) && ((seqTypeOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY) || 
+    				                 (seqTypeOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_ONE))) {
+    			isInstanceOf = true; 
+    		 }
+    		 else if (rSeqSize == 1) {
+    			isInstanceOf = true; 
+    		 }
+    		 else if ((seqTypeOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY) ||
+    				  (seqTypeOccrIndicator == SequenceTypeSupport.OccurrenceIndicator.ONE_OR_MANY)) {
+    			 // here, rSeqSize > 1
+    			 isInstanceOf = true; 
+    		 }
+    	  }
+    	  else {
+    		 isInstanceOf = true; 
+    	  }
+      }
     
       return isInstanceOf;
   }
@@ -605,9 +656,25 @@ public class InstanceOf extends Operation
 	  boolean isInstanceOf = false;
           
 	  int nodeSetLen = nodeSet.getLength();          
-	  int itemTypeOccurenceIndicator = seqTypeData.getItemTypeOccurrenceIndicator();	  
-
-	  if ((nodeSetLen > 1) && ((itemTypeOccurenceIndicator == 0) || (itemTypeOccurenceIndicator == OccurrenceIndicator.ZERO_OR_ONE))) {
+	  	  	  	  
+	  SequenceTypeKindTest seqTypeKindTest = seqTypeData.getSequenceTypeKindTest();
+	  int itemTypeOccurenceIndicator = seqTypeData.getItemTypeOccurrenceIndicator();
+	  
+	  if ((seqTypeKindTest != null) && (seqTypeKindTest.getKindVal() == SequenceTypeSupport.ITEM_KIND)) {
+		  if ((nodeSetLen == 0) && ((itemTypeOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY) || 
+				                                                              (itemTypeOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_ONE))) {
+			  isInstanceOf = true; 
+		  }
+		  else if (nodeSetLen == 1) {
+			  isInstanceOf = true; 
+		  }
+		  else if ((itemTypeOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ZERO_OR_MANY) ||
+				   (itemTypeOccurenceIndicator == SequenceTypeSupport.OccurrenceIndicator.ONE_OR_MANY)) {
+			  // here, nodeSetLen > 1
+			  isInstanceOf = true; 
+		  }
+	  }
+	  else if ((nodeSetLen > 1) && ((itemTypeOccurenceIndicator == 0) || (itemTypeOccurenceIndicator == OccurrenceIndicator.ZERO_OR_ONE))) {
 		  isInstanceOf = false; 
 	  }
 	  else {
@@ -621,8 +688,7 @@ public class InstanceOf extends Operation
 			  java.lang.String nodeName = dtm.getNodeName(nextNode);
 			  java.lang.String nodeNsUri = dtm.getNamespaceURI(nextNode);
 
-			  if (dtm.getNodeType(nextNode) == DTM.DOCUMENT_NODE) {
-				  SequenceTypeKindTest seqTypeKindTest = seqTypeData.getSequenceTypeKindTest();				  
+			  if (dtm.getNodeType(nextNode) == DTM.DOCUMENT_NODE) {				  
 				  if ((seqTypeKindTest != null) && (seqTypeKindTest.getKindVal() == SequenceTypeSupport.DOCUMENT_KIND)) {
 					  nodeSetSequenceTypeKindTestResultList.add(Boolean.valueOf(true)); 
 				  }
@@ -632,8 +698,7 @@ public class InstanceOf extends Operation
 					  break;
 				  }
 			  }
-			  else if (dtm.getNodeType(nextNode) == DTM.ELEMENT_NODE) {
-				  SequenceTypeKindTest seqTypeKindTest = seqTypeData.getSequenceTypeKindTest();				  
+			  else if (dtm.getNodeType(nextNode) == DTM.ELEMENT_NODE) {				  
 				  if (seqTypeKindTest != null) {
 					  XMLNodeCursorImpl xmlNodeCursorImpl = new XMLNodeCursorImpl(nextNode, dtmIter.getDTMManager());
 					  SequenceTypeKindTest seqTypeKindTest2 = xmlNodeCursorImpl.getSeqTypeKindTest();
@@ -789,8 +854,7 @@ public class InstanceOf extends Operation
 					  break;
 				  }
 			  }
-			  else if (dtm.getNodeType(nextNode) == DTM.ATTRIBUTE_NODE) {
-				  SequenceTypeKindTest seqTypeKindTest = seqTypeData.getSequenceTypeKindTest();				  
+			  else if (dtm.getNodeType(nextNode) == DTM.ATTRIBUTE_NODE) {				  
 				  if (seqTypeKindTest != null) {
 					  java.lang.String attrNodeKindTestNodeName = seqTypeKindTest.getNodeLocalName();
 					  if (attrNodeKindTestNodeName == null || "".equals(attrNodeKindTestNodeName) || 
@@ -891,14 +955,12 @@ public class InstanceOf extends Operation
 					  break;
 				  } 
 			  }
-			  else if (dtm.getNodeType(nextNode) == DTM.TEXT_NODE) {
-				  SequenceTypeKindTest seqTypeKindTest = seqTypeData.getSequenceTypeKindTest();				  
+			  else if (dtm.getNodeType(nextNode) == DTM.TEXT_NODE) {				  
 				  if (seqTypeKindTest.getKindVal() == SequenceTypeSupport.TEXT_KIND) {
 					  nodeSetSequenceTypeKindTestResultList.add(Boolean.valueOf(true)); 
 				  }
 			  }
-			  else if (dtm.getNodeType(nextNode) == DTM.NAMESPACE_NODE) {
-				  SequenceTypeKindTest seqTypeKindTest = seqTypeData.getSequenceTypeKindTest();				  
+			  else if (dtm.getNodeType(nextNode) == DTM.NAMESPACE_NODE) {				  
 				  if (seqTypeKindTest.getKindVal() == SequenceTypeSupport.NAMESPACE_NODE_KIND) {
 					  nodeSetSequenceTypeKindTestResultList.add(Boolean.valueOf(true)); 
 				  }
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 18331f0ff..011e13bdf 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-10-28T12:25:56Z" fail="30" name="as" pass="74" skipped="4" statusUnknown="1" totalRun="105">
+<?xml version="1.0" encoding="UTF-8"?><testrun dateTime="2025-10-31T12:11:39Z" fail="28" name="as" pass="76" skipped="4" statusUnknown="1" totalRun="105">
    <testResult status="pass" testName="as-0101"/>
    <testResult status="pass" testName="as-0102"/>
    <testResult status="pass" testName="as-0103"/>
@@ -44,8 +44,8 @@
    <testResult status="pass" testName="as-0135"/>
    <testResult status="pass" testName="as-0136"/>
    <testResult status="pass" testName="as-0137"/>
-   <testResult status="fail" testName="as-0138"/>
-   <testResult status="fail" testName="as-0139"/>
+   <testResult status="pass" testName="as-0138"/>
+   <testResult status="pass" testName="as-0139"/>
    <testResult status="pass" testName="as-0140"/>
    <testResult status="fail" testName="as-0141"/>
    <testResult status="fail" testName="as-0142"/>
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 9798aea5f..ebaa83481 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,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<testResult dateTime="2025-10-30T13:02:44Z" desc="W3C XSLT 3.0 test suite results" fail="658" pass="1788" skipped="75" success="72.65%" totalRun="2461" xslt_processor="Xalan-J XSLT 3.0 development code">
+<testResult dateTime="2025-10-31T12:12:05Z" desc="W3C XSLT 3.0 test suite results" fail="656" pass="1790" skipped="75" success="72.73%" totalRun="2461" xslt_processor="Xalan-J XSLT 3.0 development code">
   <attr>
-    <as fail="30" pass="74" skipped="4" success="70.48%" totalRun="105"/>
+    <as fail="28" pass="76" skipped="4" success="72.38%" totalRun="105"/>
     <avt fail="15" pass="20" skipped="0" success="57.14%" totalRun="35"/>
     <expand-text fail="8" pass="54" skipped="0" success="87.1%" totalRun="62"/>
     <match fail="60" pass="68" skipped="8" success="52.71%" totalRun="129"/>


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