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 2023/06/04 17:16:12 UTC

[xalan-java] branch xalan-j_xslt3.0 updated: committing minor improvements to support for xml schema data types xs:integer, xs:long and xs:int. the implementation of xpath 3.1 function fn:not, required minor enhancements to support these changes (these changes, have been committed as well). committing few new related working test cases as well.

This is an automated email from the ASF dual-hosted git repository.

mukulg pushed a commit to branch xalan-j_xslt3.0
in repository https://gitbox.apache.org/repos/asf/xalan-java.git


The following commit(s) were added to refs/heads/xalan-j_xslt3.0 by this push:
     new 7f642afe committing minor improvements to support for xml schema data types xs:integer, xs:long and xs:int. the implementation of xpath 3.1 function fn:not, required minor enhancements to support these changes (these changes, have been committed as well). committing few new related working test cases as well.
7f642afe is described below

commit 7f642afe515fd49eb4c96b7254a148e33c438312
Author: Mukul Gandhi <ga...@gmail.com>
AuthorDate: Sun Jun 4 22:45:46 2023 +0530

    committing minor improvements to support for xml schema data types xs:integer, xs:long and xs:int. the implementation of xpath 3.1 function fn:not, required minor enhancements to support these changes (these changes, have been committed as well). committing few new related working test cases as well.
---
 src/org/apache/xalan/templates/ElemVariable.java   |  8 ++--
 .../xalan/templates/XSConstructorFunctionUtil.java | 33 ++++++++++++++
 src/org/apache/xpath/compiler/Keywords.java        |  9 ++++
 src/org/apache/xpath/functions/FuncNot.java        | 24 ++++++++--
 src/org/apache/xpath/objects/XObject.java          | 39 +++++++++-------
 src/org/apache/xpath/operations/Minus.java         | 30 ++++++++++++-
 src/org/apache/xpath/operations/Plus.java          | 35 ++++++++++++++-
 src/org/apache/xpath/xs/types/XSInt.java           | 42 +++++++++++++++--
 src/org/apache/xpath/xs/types/XSInteger.java       | 52 ++++++++++++++++++++--
 src/org/apache/xpath/xs/types/XSLong.java          | 42 +++++++++++++++--
 .../xalan/xpath3/XsConstructorFunctions.java       | 30 +++++++++++++
 tests/xs_constructor_functions/gold/test10.out     |  7 +++
 .../{test9.xsl => test10.xsl}                      | 14 +++---
 .../{test9.xsl => test11.xsl}                      | 14 +++---
 .../{test9.xsl => test12.xsl}                      | 14 +++---
 tests/xs_constructor_functions/test1_b.xml         |  9 ++++
 tests/xs_constructor_functions/test9.xsl           |  2 +-
 17 files changed, 353 insertions(+), 51 deletions(-)

diff --git a/src/org/apache/xalan/templates/ElemVariable.java b/src/org/apache/xalan/templates/ElemVariable.java
index 8b14015f..97ef6171 100644
--- a/src/org/apache/xalan/templates/ElemVariable.java
+++ b/src/org/apache/xalan/templates/ElemVariable.java
@@ -318,15 +318,15 @@ public class ElemVariable extends ElemTemplateElement
 
         var.allowDetachToRelease(false);
 
-        if (transformer.getDebug())
-          transformer.getTraceManager().fireSelectedEvent(sourceNode, this,
-                  "select", m_selectPattern, var);
+        if (transformer.getDebug()) {
+            transformer.getTraceManager().fireSelectedEvent(sourceNode, this, "select", 
+                                                                    m_selectPattern, var);
+        }
       }
       else if (null == getFirstChildElem()) {
          var = XString.EMPTYSTRING;
       }
       else {
-
         // Use result tree fragment.
         // Global variables may be deferred (see XUnresolvedVariable) and hence
         // need to be assigned to a different set of DTMs than local variables
diff --git a/src/org/apache/xalan/templates/XSConstructorFunctionUtil.java b/src/org/apache/xalan/templates/XSConstructorFunctionUtil.java
index e43e7ab7..8f4911ee 100644
--- a/src/org/apache/xalan/templates/XSConstructorFunctionUtil.java
+++ b/src/org/apache/xalan/templates/XSConstructorFunctionUtil.java
@@ -30,6 +30,9 @@ import org.apache.xpath.xs.types.XSBoolean;
 import org.apache.xpath.xs.types.XSDecimal;
 import org.apache.xpath.xs.types.XSDouble;
 import org.apache.xpath.xs.types.XSFloat;
+import org.apache.xpath.xs.types.XSInt;
+import org.apache.xpath.xs.types.XSInteger;
+import org.apache.xpath.xs.types.XSLong;
 import org.xml.sax.SAXException;
 
 /**
@@ -85,6 +88,36 @@ public class XSConstructorFunctionUtil {
                     ResultSequence rSeq = (new XSDouble()).constructor(argSequence);
                     evalResult = rSeq.item(0);              
                 }
+                else if ((Keywords.FUNC_XS_INTEGER).equals(funcExtFunction.getFunctionName())) {                              
+                    ResultSequence argSequence = new ResultSequence();
+                    for (int idx = 0; idx < funcExtFunction.getArgCount(); idx++) {
+                        XObject argVal = (funcExtFunction.getArg(idx)).execute(xctxt);
+                        argSequence.add(new XSInteger(argVal.str()));
+                    }
+
+                    ResultSequence rSeq = (new XSInteger()).constructor(argSequence);
+                    evalResult = rSeq.item(0);              
+                }
+                else if ((Keywords.FUNC_XS_LONG).equals(funcExtFunction.getFunctionName())) {                              
+                    ResultSequence argSequence = new ResultSequence();
+                    for (int idx = 0; idx < funcExtFunction.getArgCount(); idx++) {
+                        XObject argVal = (funcExtFunction.getArg(idx)).execute(xctxt);
+                        argSequence.add(new XSLong(argVal.str()));
+                    }
+
+                    ResultSequence rSeq = (new XSLong()).constructor(argSequence);
+                    evalResult = rSeq.item(0);              
+                }
+                else if ((Keywords.FUNC_XS_INT).equals(funcExtFunction.getFunctionName())) {                              
+                    ResultSequence argSequence = new ResultSequence();
+                    for (int idx = 0; idx < funcExtFunction.getArgCount(); idx++) {
+                        XObject argVal = (funcExtFunction.getArg(idx)).execute(xctxt);
+                        argSequence.add(new XSInt(argVal.str()));
+                    }
+
+                    ResultSequence rSeq = (new XSInt()).constructor(argSequence);
+                    evalResult = rSeq.item(0);              
+                }
                 else if ((Keywords.FUNC_BOOLEAN_STRING).equals(funcExtFunction.getFunctionName())) {                              
                     ResultSequence argSequence = new ResultSequence();
                     for (int idx = 0; idx < funcExtFunction.getArgCount(); idx++) {
diff --git a/src/org/apache/xpath/compiler/Keywords.java b/src/org/apache/xpath/compiler/Keywords.java
index 6b7a3ae9..fceac675 100644
--- a/src/org/apache/xpath/compiler/Keywords.java
+++ b/src/org/apache/xpath/compiler/Keywords.java
@@ -271,6 +271,15 @@ public class Keywords
   
   /** xs:double data type string. */
   public static final String FUNC_XS_DOUBLE = "double";
+  
+  /** xs:integer data type string. */
+  public static final String FUNC_XS_INTEGER = "integer";
+  
+  /** xs:long data type string. */
+  public static final String FUNC_XS_LONG = "long";
+  
+  /** xs:int data type string. */
+  public static final String FUNC_XS_INT = "int";
 
   static
   {
diff --git a/src/org/apache/xpath/functions/FuncNot.java b/src/org/apache/xpath/functions/FuncNot.java
index e05cb8ca..eff2f33d 100644
--- a/src/org/apache/xpath/functions/FuncNot.java
+++ b/src/org/apache/xpath/functions/FuncNot.java
@@ -20,12 +20,16 @@
  */
 package org.apache.xpath.functions;
 
+import org.apache.xalan.templates.XSConstructorFunctionUtil;
 import org.apache.xpath.XPathContext;
 import org.apache.xpath.objects.XBoolean;
 import org.apache.xpath.objects.XObject;
+import org.apache.xpath.operations.Operation;
+import org.xml.sax.SAXException;
 
 /**
- * Execute the Not() function.
+ * Execute the not() function.
+ * 
  * @xsl.usage advanced
  */
 public class FuncNot extends FunctionOneArg
@@ -33,8 +37,9 @@ public class FuncNot extends FunctionOneArg
     static final long serialVersionUID = 7299699961076329790L;
 
   /**
-   * Execute the function.  The function must return
+   * Execute the function. The function must return
    * a valid object.
+   * 
    * @param xctxt The current execution context.
    * @return A valid XObject.
    *
@@ -42,6 +47,19 @@ public class FuncNot extends FunctionOneArg
    */
   public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
   {
-    return m_arg0.execute(xctxt).bool() ? XBoolean.S_FALSE : XBoolean.S_TRUE;
+      if (m_arg0 instanceof Operation) {
+          try {
+             XObject result = XSConstructorFunctionUtil.processFuncExtFunctionOrXPathOpn(
+                                                                                    xctxt, m_arg0);
+             return result.bool() ? XBoolean.S_FALSE : XBoolean.S_TRUE; 
+          }
+          catch(SAXException ex) {
+             throw new javax.xml.transform.TransformerException(ex.getMessage());    
+          }
+      }
+      else {
+          return m_arg0.execute(xctxt).bool() ? XBoolean.S_FALSE : XBoolean.S_TRUE;
+      }
   }
+  
 }
diff --git a/src/org/apache/xpath/objects/XObject.java b/src/org/apache/xpath/objects/XObject.java
index f96898e3..d9fe70de 100644
--- a/src/org/apache/xpath/objects/XObject.java
+++ b/src/org/apache/xpath/objects/XObject.java
@@ -37,6 +37,9 @@ import org.apache.xpath.xs.types.XSBoolean;
 import org.apache.xpath.xs.types.XSDecimal;
 import org.apache.xpath.xs.types.XSDouble;
 import org.apache.xpath.xs.types.XSFloat;
+import org.apache.xpath.xs.types.XSInt;
+import org.apache.xpath.xs.types.XSInteger;
+import org.apache.xpath.xs.types.XSLong;
 import org.w3c.dom.DocumentFragment;
 import org.w3c.dom.NodeList;
 import org.w3c.dom.traversal.NodeIterator;
@@ -46,6 +49,7 @@ import org.w3c.dom.traversal.NodeIterator;
  * converting the object to various types, such as a string.
  * This class acts as the base class to other XPath type objects,
  * such as XString, and provides polymorphic casting capabilities.
+ * 
  * @xsl.usage general
  */
 public class XObject extends Expression implements Serializable, Cloneable
@@ -640,29 +644,34 @@ public class XObject extends Expression implements Serializable, Cloneable
        return ((XSDecimal)this).equals((XSDecimal)obj2);        
     }
     else if ((this instanceof XSFloat) && (obj2 instanceof XSFloat)) {
-        return ((XSFloat)this).equals((XSFloat)obj2);        
+       return ((XSFloat)this).equals((XSFloat)obj2);        
     }
     else if ((this instanceof XSDouble) && (obj2 instanceof XSDouble)) {
-        return ((XSDouble)this).equals((XSDouble)obj2);        
+       return ((XSDouble)this).equals((XSDouble)obj2);        
     }
     else if ((this instanceof XSBoolean) && (obj2 instanceof XSBoolean)) {
        return ((XSBoolean)this).equals((XSBoolean)obj2);    
     }
-    
-    // In order to handle the 'all' semantics of 
-    // nodeset comparisons, we always call the 
-    // nodeset function.
-    if (obj2.getType() == XObject.CLASS_NODESET)
-      return obj2.equals(this);
-
-    if (null != m_obj)
-    {
-      return m_obj.equals(obj2.m_obj);
+    else if ((this instanceof XSInteger) && (obj2 instanceof XSInteger)) {
+       return ((XSInteger)this).equals((XSInteger)obj2);    
     }
-    else
-    {
-      return obj2.m_obj == null;
+    else if ((this instanceof XSLong) && (obj2 instanceof XSLong)) {
+       return ((XSLong)this).equals((XSLong)obj2);    
+    }
+    else if ((this instanceof XSInt) && (obj2 instanceof XSInt)) {
+       return ((XSInt)this).equals((XSInt)obj2);    
+    }
+        
+    if (obj2.getType() == XObject.CLASS_NODESET) {
+       return obj2.equals(this);
+    }
+
+    if (m_obj != null) {
+       return m_obj.equals(obj2.m_obj);
     }
+    else {
+       return obj2.m_obj == null;
+    }    
   }
 
   /**
diff --git a/src/org/apache/xpath/operations/Minus.java b/src/org/apache/xpath/operations/Minus.java
index 4874bb49..e4f015ca 100644
--- a/src/org/apache/xpath/operations/Minus.java
+++ b/src/org/apache/xpath/operations/Minus.java
@@ -20,11 +20,16 @@
  */
 package org.apache.xpath.operations;
 
+import java.math.BigInteger;
+
 import org.apache.xpath.XPathContext;
 import org.apache.xpath.objects.XNumber;
 import org.apache.xpath.objects.XObject;
 import org.apache.xpath.xs.types.XSDecimal;
 import org.apache.xpath.xs.types.XSFloat;
+import org.apache.xpath.xs.types.XSInt;
+import org.apache.xpath.xs.types.XSInteger;
+import org.apache.xpath.xs.types.XSLong;
 
 /**
  * The binary '-' operation expression executer.
@@ -49,6 +54,27 @@ public class Minus extends Operation
                                            throws javax.xml.transform.TransformerException {
       XObject result = null;
       
+      if ((left instanceof XSInteger) && (right instanceof XSInteger)) {
+         BigInteger bigIntLeft = ((XSInteger)left).intValue();
+         BigInteger bigIntRight = ((XSInteger)right).intValue();
+          
+         return new XSInteger(bigIntLeft.subtract(bigIntRight));    
+      }
+       
+      if ((left instanceof XSLong) && (right instanceof XSLong)) {
+          BigInteger bigIntLeft = ((XSLong)left).intValue();
+          BigInteger bigIntRight = ((XSLong)right).intValue();
+           
+          return new XSLong(bigIntLeft.subtract(bigIntRight));    
+      }
+       
+      if ((left instanceof XSInt) && (right instanceof XSInt)) {
+          BigInteger bigIntLeft = ((XSInt)left).intValue();
+          BigInteger bigIntRight = ((XSInt)right).intValue();
+           
+          return new XSInt(bigIntLeft.subtract(bigIntRight));    
+      }
+      
       double leftArg = 0.0;
       double rightArg = 0.0;
       
@@ -81,8 +107,8 @@ public class Minus extends Operation
       }
       
       if (isFloatLarg && isFloatRarg) {
-         // currently, supporting XSFloat typed result, when both 
-         // operands are of type XSFloat.  
+         // currently, supporting XSFloat typed result, when both operands 
+         // are of type XSFloat.  
          result = new XSFloat(lArg - rArg);
          return result;
       }
diff --git a/src/org/apache/xpath/operations/Plus.java b/src/org/apache/xpath/operations/Plus.java
index eb769d98..d2475512 100644
--- a/src/org/apache/xpath/operations/Plus.java
+++ b/src/org/apache/xpath/operations/Plus.java
@@ -20,11 +20,16 @@
  */
 package org.apache.xpath.operations;
 
+import java.math.BigInteger;
+
 import org.apache.xpath.XPathContext;
 import org.apache.xpath.objects.XNumber;
 import org.apache.xpath.objects.XObject;
 import org.apache.xpath.xs.types.XSDecimal;
 import org.apache.xpath.xs.types.XSFloat;
+import org.apache.xpath.xs.types.XSInt;
+import org.apache.xpath.xs.types.XSInteger;
+import org.apache.xpath.xs.types.XSLong;
 
 /**
  * The '+' operation expression executer.
@@ -48,6 +53,31 @@ public class Plus extends Operation
                                            throws javax.xml.transform.TransformerException {
       XObject result = null;
       
+      if ((left instanceof XSInteger) && (right instanceof XSInteger)) {
+         BigInteger bigintLeft = ((XSInteger)left).intValue();
+         BigInteger bigintRight = ((XSInteger)right).intValue();
+         
+         return new XSInteger(bigintLeft.add(bigintRight));    
+      }
+      
+      if ((left instanceof XSLong) && (right instanceof XSLong)) {
+          BigInteger bigintLeft = ((XSLong)left).intValue();
+          BigInteger bigintRight = ((XSLong)right).intValue();
+          
+          // its possible that, result after addition is, not within value space of xs:long.
+          // handle this error. revisit
+          return new XSLong(bigintLeft.add(bigintRight));    
+      }
+      
+      if ((left instanceof XSInt) && (right instanceof XSInt)) {
+          BigInteger bigintLeft = ((XSInt)left).intValue();
+          BigInteger bigintRight = ((XSInt)right).intValue();
+          
+          // its possible that, result after addition is, not within value space of xs:int.
+          // handle this error. revisit
+          return new XSInt(bigintLeft.add(bigintRight));    
+      }
+      
       double leftArg = 0.0;
       double rightArg = 0.0;
       
@@ -80,9 +110,10 @@ public class Plus extends Operation
       }
       
       if (isFloatLarg && isFloatRarg) {
-         // currently, supporting XSFloat typed result, when both 
-         // operands are of type XSFloat.  
+         // currently, supporting XSFloat typed result, when both operands 
+         // are of type XSFloat.  
          result = new XSFloat(lArg + rArg);
+         
          return result;
       }
       
diff --git a/src/org/apache/xpath/xs/types/XSInt.java b/src/org/apache/xpath/xs/types/XSInt.java
index 19e47959..72249bf6 100644
--- a/src/org/apache/xpath/xs/types/XSInt.java
+++ b/src/org/apache/xpath/xs/types/XSInt.java
@@ -34,6 +34,10 @@ public class XSInt extends XSLong {
     
     private static final String XS_INT = "xs:int";
     
+    private static BigInteger MIN_INCLUSIVE = BigInteger.valueOf(-2147483648L);
+    
+    private static BigInteger MAX_INCLUSIVE = BigInteger.valueOf(2147483647L);
+    
 	/*
 	 * Class constructor.
 	 */
@@ -48,10 +52,38 @@ public class XSInt extends XSLong {
 		super(val);
 	}
 	
+	/*
+     * Class constructor.
+     */
+    public XSInt(String val) {
+        super(val);
+    }
+	
 	@Override
-    public ResultSequence constructor(ResultSequence arg) {
-       // to do
-       return null;
+    public ResultSequence constructor(ResultSequence arg) throws RuntimeException {
+        ResultSequence resultSeq = new ResultSequence();
+        
+        if (arg.size() == 0) {
+           return resultSeq;     
+        }
+        
+        XSAnyType xsAnyType = (XSAnyType)arg.item(0);
+
+        try {
+            BigInteger bigInt = new BigInteger(xsAnyType.stringValue());          
+
+            if (bigInt.compareTo(MIN_INCLUSIVE) == -1 || 
+                                            bigInt.compareTo(MAX_INCLUSIVE) == 1) {
+                throw new RuntimeException("An instance of type xs:int cannot be created. The numeric argument "
+                                                                           + "'" + xsAnyType.stringValue() + "' provided is out of range for type xs:int.");  
+            }
+            
+            resultSeq.add(new XSInt(bigInt));
+        } catch (NumberFormatException ex) {
+            throw new RuntimeException(ex.getMessage());
+        }
+        
+        return resultSeq;
     }
 	
 	public String stringType() {
@@ -62,4 +94,8 @@ public class XSInt extends XSLong {
 		return "int";
 	}
 	
+	public boolean equals(XSInt xsInt) {
+        return _value.equals(xsInt.intValue()); 
+    }
+	
 }
diff --git a/src/org/apache/xpath/xs/types/XSInteger.java b/src/org/apache/xpath/xs/types/XSInteger.java
index 687d6868..0d207894 100644
--- a/src/org/apache/xpath/xs/types/XSInteger.java
+++ b/src/org/apache/xpath/xs/types/XSInteger.java
@@ -34,7 +34,9 @@ public class XSInteger extends XSDecimal {
 
     private static final String XS_INTEGER = "xs:integer";
 	
-	private BigInteger _value;
+    // the underlying java.math.BigInteger value, representing 
+    // this XML Schema datatype value. 
+	protected BigInteger _value;
 
 	/*
 	 * Class constructor.
@@ -88,8 +90,23 @@ public class XSInteger extends XSDecimal {
 	}
 
 	public ResultSequence constructor(ResultSequence arg) {
-	    // to do
-        return null;
+        ResultSequence resultSeq = new ResultSequence();
+        
+        if (arg.size() == 0) {
+           return resultSeq;     
+        }
+        
+        XSAnyType xsAnyType = (XSAnyType)arg.item(0);
+        
+        try {
+            BigInteger bigInteger = castToInteger(xsAnyType);            
+            resultSeq.add(new XSInteger(bigInteger));            
+        } catch (NumberFormatException e) {
+            // to do
+            return null;
+        }
+        
+        return resultSeq;
 	}
 
 	/**
@@ -110,5 +127,34 @@ public class XSInteger extends XSDecimal {
 	public void setInt(BigInteger val) {
 		_value = val;
 	}
+	
+	/*
+	 * Do a datatype cast, of a generic typed XML Schema value,
+	 * to a java.math.BigInteger value. 
+	 */
+	private BigInteger castToInteger(XSAnyType xsAnyType) {
+	    
+        if (xsAnyType instanceof XSBoolean) {
+            if ((xsAnyType.stringValue()).equals("true")) {
+                return BigInteger.ONE;
+            } 
+            else {
+                return BigInteger.ZERO;
+            }
+        }
+        
+        if ((xsAnyType instanceof XSDecimal) || (xsAnyType instanceof XSFloat) ||
+                                                (xsAnyType instanceof XSDouble)) {
+           BigDecimal bigDecimal =  new BigDecimal(xsAnyType.stringValue());
+           
+           return bigDecimal.toBigInteger();
+        }
+        
+        return new BigInteger(xsAnyType.stringValue());
+    }
+	
+	public boolean equals(XSInteger xsInteger) {
+        return _value.equals(xsInteger.intValue()); 
+    }
 
 }
diff --git a/src/org/apache/xpath/xs/types/XSLong.java b/src/org/apache/xpath/xs/types/XSLong.java
index e241f950..482bfb1d 100644
--- a/src/org/apache/xpath/xs/types/XSLong.java
+++ b/src/org/apache/xpath/xs/types/XSLong.java
@@ -32,6 +32,10 @@ public class XSLong extends XSInteger {
     private static final long serialVersionUID = -1030394161532436404L;
     
     private static final String XS_LONG = "xs:long";
+    
+    private static BigInteger MIN_INCLUSIVE = BigInteger.valueOf(-9223372036854775808L);
+    
+    private static BigInteger MAX_INCLUSIVE = BigInteger.valueOf(9223372036854775807L);
 
 	/*
 	 * Class constructor.
@@ -47,10 +51,38 @@ public class XSLong extends XSInteger {
 		super(val);
 	}
 	
+	/*
+     * Class constructor.
+     */
+    public XSLong(String val) {
+        super(val);
+    }
+	
 	@Override
-    public ResultSequence constructor(ResultSequence arg) {
-       // to do
-       return null;
+    public ResultSequence constructor(ResultSequence arg) throws RuntimeException {
+        ResultSequence resultSeq = new ResultSequence();
+        
+        if (arg.size() == 0) {
+           return resultSeq;     
+        }
+        
+        XSAnyType xsAnyType = (XSAnyType)arg.item(0);
+
+        try {
+            BigInteger bigInt = new BigInteger(xsAnyType.stringValue());     
+
+            if (bigInt.compareTo(MIN_INCLUSIVE) == -1 || 
+                                         bigInt.compareTo(MAX_INCLUSIVE) == 1) {
+                throw new RuntimeException("An instance of type xs:long cannot be created. The numeric argument "
+                                                                     + "'" + xsAnyType.stringValue() + "' provided is out of range for type xs:long.");  
+            }
+            
+            resultSeq.add(new XSLong(bigInt));
+        } catch (NumberFormatException ex) {
+            throw new RuntimeException(ex.getMessage());
+        }
+        
+        return resultSeq;
     }
 	
 	public String stringType() {
@@ -60,5 +92,9 @@ public class XSLong extends XSInteger {
 	public String typeName() {
 		return "long";
 	}
+	
+	public boolean equals(XSLong xsLong) {
+        return _value.equals(xsLong.intValue()); 
+    }
 
 }
diff --git a/tests/org/apache/xalan/xpath3/XsConstructorFunctions.java b/tests/org/apache/xalan/xpath3/XsConstructorFunctions.java
index 0c819991..ef279847 100644
--- a/tests/org/apache/xalan/xpath3/XsConstructorFunctions.java
+++ b/tests/org/apache/xalan/xpath3/XsConstructorFunctions.java
@@ -137,5 +137,35 @@ public class XsConstructorFunctions extends XslTransformTestsUtil {
         
         runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
     }
+    
+    @Test
+    public void XsConstructorFunctionsTest10() {
+        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test1_b.xml"; 
+        String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test10.xsl";
+        
+        String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test10.out";                
+        
+        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
+    }
+    
+    @Test
+    public void XsConstructorFunctionsTest11() {
+        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test1_b.xml"; 
+        String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test11.xsl";
+        
+        String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test10.out";                
+        
+        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
+    }
+    
+    @Test
+    public void XsConstructorFunctionsTest12() {
+        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test1_b.xml"; 
+        String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test12.xsl";
+        
+        String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test10.out";                
+        
+        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
+    }
 
 }
diff --git a/tests/xs_constructor_functions/gold/test10.out b/tests/xs_constructor_functions/gold/test10.out
new file mode 100644
index 00000000..56fcadef
--- /dev/null
+++ b/tests/xs_constructor_functions/gold/test10.out
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?><result>
+  <one>5</one>
+  <two>3</two>
+  <three>true</three>
+  <four>false</four>
+  <five>5</five>
+</result>
diff --git a/tests/xs_constructor_functions/test9.xsl b/tests/xs_constructor_functions/test10.xsl
similarity index 67%
copy from tests/xs_constructor_functions/test9.xsl
copy to tests/xs_constructor_functions/test10.xsl
index f77f718c..2d0ef7e7 100644
--- a/tests/xs_constructor_functions/test9.xsl
+++ b/tests/xs_constructor_functions/test10.xsl
@@ -6,17 +6,21 @@
                 
    <!-- Author: mukulg@apache.org -->
    
-   <!-- use with test1_a.xml -->
+   <!-- use with test1_b.xml -->
    
-     <!-- this stylesheet, does few XPath arithmetic operations, 
-          involving xs:float types. -->              
+     <!-- this stylesheet, does few XPath arithmetic and logical operations, 
+          involving xs:integer type. -->              
 
    <xsl:output method="xml" indent="yes"/>
 
    <xsl:template match="/elem">
       <result>
-         <one><xsl:value-of select="xs:float(b) - xs:float(a)"/></one>
-         <two><xsl:value-of select="xs:float(a) + xs:float(b)"/></two>
+         <one><xsl:value-of select="xs:integer(a) + xs:integer(b)"/></one>
+         <two><xsl:value-of select="xs:integer(d) - xs:integer(a)"/></two>
+         <three><xsl:value-of select="(xs:integer(d) - xs:integer(a)) = 3"/></three>
+         <four><xsl:value-of select="not((xs:integer(d) - xs:integer(a)) = 3)"/></four>
+         <xsl:variable name="temp1" select="xs:integer(a) + xs:integer(b)"/>
+         <five><xsl:value-of select="$temp1"/></five>
       </result>
    </xsl:template>
    
diff --git a/tests/xs_constructor_functions/test9.xsl b/tests/xs_constructor_functions/test11.xsl
similarity index 68%
copy from tests/xs_constructor_functions/test9.xsl
copy to tests/xs_constructor_functions/test11.xsl
index f77f718c..03955a4f 100644
--- a/tests/xs_constructor_functions/test9.xsl
+++ b/tests/xs_constructor_functions/test11.xsl
@@ -6,17 +6,21 @@
                 
    <!-- Author: mukulg@apache.org -->
    
-   <!-- use with test1_a.xml -->
+   <!-- use with test1_b.xml -->
    
-     <!-- this stylesheet, does few XPath arithmetic operations, 
-          involving xs:float types. -->              
+     <!-- this stylesheet, does few XPath arithmetic and logical operations, 
+          involving xs:long type. -->              
 
    <xsl:output method="xml" indent="yes"/>
 
    <xsl:template match="/elem">
       <result>
-         <one><xsl:value-of select="xs:float(b) - xs:float(a)"/></one>
-         <two><xsl:value-of select="xs:float(a) + xs:float(b)"/></two>
+         <one><xsl:value-of select="xs:long(a) + xs:long(b)"/></one>
+         <two><xsl:value-of select="xs:long(d) - xs:long(a)"/></two>
+         <three><xsl:value-of select="(xs:long(d) - xs:long(a)) = 3"/></three>
+         <four><xsl:value-of select="not((xs:long(d) - xs:long(a)) = 3)"/></four>
+         <xsl:variable name="temp1" select="xs:long(a) + xs:long(b)"/>
+         <five><xsl:value-of select="$temp1"/></five>
       </result>
    </xsl:template>
    
diff --git a/tests/xs_constructor_functions/test9.xsl b/tests/xs_constructor_functions/test12.xsl
similarity index 68%
copy from tests/xs_constructor_functions/test9.xsl
copy to tests/xs_constructor_functions/test12.xsl
index f77f718c..6d5c339e 100644
--- a/tests/xs_constructor_functions/test9.xsl
+++ b/tests/xs_constructor_functions/test12.xsl
@@ -6,17 +6,21 @@
                 
    <!-- Author: mukulg@apache.org -->
    
-   <!-- use with test1_a.xml -->
+   <!-- use with test1_b.xml -->
    
-     <!-- this stylesheet, does few XPath arithmetic operations, 
-          involving xs:float types. -->              
+     <!-- this stylesheet, does few XPath arithmetic and logical operations, 
+          involving xs:int type. -->              
 
    <xsl:output method="xml" indent="yes"/>
 
    <xsl:template match="/elem">
       <result>
-         <one><xsl:value-of select="xs:float(b) - xs:float(a)"/></one>
-         <two><xsl:value-of select="xs:float(a) + xs:float(b)"/></two>
+         <one><xsl:value-of select="xs:int(a) + xs:int(b)"/></one>
+         <two><xsl:value-of select="xs:int(d) - xs:int(a)"/></two>
+         <three><xsl:value-of select="(xs:int(d) - xs:int(a)) = 3"/></three>
+         <four><xsl:value-of select="not((xs:int(d) - xs:int(a)) = 3)"/></four>
+         <xsl:variable name="temp1" select="xs:int(a) + xs:int(b)"/>
+         <five><xsl:value-of select="$temp1"/></five>
       </result>
    </xsl:template>
    
diff --git a/tests/xs_constructor_functions/test1_b.xml b/tests/xs_constructor_functions/test1_b.xml
new file mode 100644
index 00000000..a27330f7
--- /dev/null
+++ b/tests/xs_constructor_functions/test1_b.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<elem>
+  <a>2</a>
+  <b>3</b>
+  <c>4</c>
+  <d>5</d>
+  <e>6</e>
+  <f>7</f>
+</elem>
\ No newline at end of file
diff --git a/tests/xs_constructor_functions/test9.xsl b/tests/xs_constructor_functions/test9.xsl
index f77f718c..b8164c72 100644
--- a/tests/xs_constructor_functions/test9.xsl
+++ b/tests/xs_constructor_functions/test9.xsl
@@ -9,7 +9,7 @@
    <!-- use with test1_a.xml -->
    
      <!-- this stylesheet, does few XPath arithmetic operations, 
-          involving xs:float types. -->              
+          involving xs:float type. -->              
 
    <xsl:output method="xml" indent="yes"/>
 


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