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