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/25 14:19:24 UTC

[xalan-java] branch xalan-j_xslt3.0 updated: committing implementation of xpath 3.1 value comparison operators gt, le, ge. also committing few other xalanj miscellaneous codebase improvements on this xalanj dev branch, and 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 2a1f171b committing implementation of xpath 3.1 value comparison operators gt, le, ge. also committing few other xalanj miscellaneous codebase improvements on this xalanj dev branch, and few new related working test cases as well.
     new a80e1649 Merge pull request #11 from mukulga/xalan-j_xslt3.0_mukul
2a1f171b is described below

commit 2a1f171bc8912dda76726d2da94549fb5c919e29
Author: Mukul Gandhi <ga...@gmail.com>
AuthorDate: Sun Jun 25 19:39:05 2023 +0530

    committing implementation of xpath 3.1 value comparison operators gt, le, ge. also committing few other xalanj miscellaneous codebase improvements on this xalanj dev branch, and few new related working test cases as well.
---
 .../extensions/ExtensionHandlerJavaPackage.java    |  29 ++++-
 src/org/apache/xpath/compiler/Compiler.java        |  36 ++++++
 src/org/apache/xpath/compiler/OpCodes.java         |  23 +++-
 src/org/apache/xpath/compiler/XPathParser.java     |  45 ++++++++
 src/org/apache/xpath/objects/XObject.java          | 127 +++++++++++++++++----
 src/org/apache/xpath/operations/VcEquals.java      |   2 +-
 .../xpath/operations/{VcLt.java => VcGe.java}      |   6 +-
 .../xpath/operations/{VcLt.java => VcGt.java}      |   6 +-
 .../xpath/operations/{VcLt.java => VcLe.java}      |   6 +-
 src/org/apache/xpath/operations/VcLt.java          |   2 +-
 src/org/apache/xpath/operations/VcNotEquals.java   |   2 +-
 src/org/apache/xpath/res/XPATHErrorResources.java  |  27 ++++-
 .../apache/xalan/xpath3/ValueComparisonTests.java  |  70 ++++++++++++
 tests/org/apache/xalan/xslt3/XSLConstants.java     |   4 +-
 tests/org/apache/xalan/xslt3/XslIterateTests.java  |  10 ++
 tests/xpath_value_comparison/gold/test10.out       |   5 +
 tests/xpath_value_comparison/gold/test11.out       |  14 +++
 tests/xpath_value_comparison/gold/test12.out       |  12 ++
 tests/xpath_value_comparison/gold/test13.out       |  16 +++
 tests/xpath_value_comparison/gold/test14.out       |  16 +++
 tests/xpath_value_comparison/gold/test8.out        |   5 +
 tests/xpath_value_comparison/gold/test9.out        |   5 +
 tests/xpath_value_comparison/test10.xsl            |  38 ++++++
 tests/xpath_value_comparison/test11.xsl            |  46 ++++++++
 tests/xpath_value_comparison/test12.xsl            |  47 ++++++++
 tests/xpath_value_comparison/test13.xsl            |  43 +++++++
 tests/xpath_value_comparison/test14.xsl            |  43 +++++++
 tests/xpath_value_comparison/test1_c.xml           |   9 ++
 tests/xpath_value_comparison/test1_d.xml           |   9 ++
 tests/xpath_value_comparison/test1_e.xml           |  13 +++
 tests/xpath_value_comparison/test8.xsl             |  38 ++++++
 tests/xpath_value_comparison/test9.xsl             |  38 ++++++
 tests/xsl_iterate/gold/test14.out                  |   8 ++
 tests/xsl_iterate/test14.xsl                       |  48 ++++++++
 tests/xsl_iterate/test1_e.xml                      |  13 +++
 35 files changed, 819 insertions(+), 42 deletions(-)

diff --git a/src/org/apache/xalan/extensions/ExtensionHandlerJavaPackage.java b/src/org/apache/xalan/extensions/ExtensionHandlerJavaPackage.java
index fcdcc4cc..f7d09744 100644
--- a/src/org/apache/xalan/extensions/ExtensionHandlerJavaPackage.java
+++ b/src/org/apache/xalan/extensions/ExtensionHandlerJavaPackage.java
@@ -33,10 +33,12 @@ import org.apache.xalan.res.XSLMessages;
 import org.apache.xalan.res.XSLTErrorResources;
 import org.apache.xalan.templates.ElemTemplateElement;
 import org.apache.xalan.templates.Stylesheet;
+import org.apache.xalan.templates.XSConstructorFunctionUtil;
 import org.apache.xalan.trace.ExtensionEvent;
 import org.apache.xalan.transformer.TransformerImpl;
 import org.apache.xpath.functions.FuncExtFunction;
 import org.apache.xpath.objects.XObject;
+import org.xml.sax.SAXException;
 
 /**
  * Represents an extension namespace for XPath that handles java packages
@@ -58,8 +60,6 @@ import org.apache.xpath.objects.XObject;
  *
  * @xsl.usage internal
  */
-
-
 public class ExtensionHandlerJavaPackage extends ExtensionHandlerJava
 {
 
@@ -434,11 +434,28 @@ public class ExtensionHandlerJavaPackage extends ExtensionHandlerJava
    */
   public Object callFunction(FuncExtFunction extFunction,
                              Vector args,
-                             ExpressionContext exprContext)
-      throws TransformerException
+                             ExpressionContext exprContext) throws TransformerException
   {
-    return callFunction(extFunction.getFunctionName(), args, 
-                        extFunction.getMethodKey(), exprContext);
+      
+      Object funcEvalResult = null;
+      
+      try {
+          XObject evalResult = XSConstructorFunctionUtil.processFuncExtFunctionOrXPathOpn
+                                                                           (exprContext.getXPathContext(), extFunction);
+          if (evalResult != null) {
+             funcEvalResult = evalResult;
+          }
+          else {
+             funcEvalResult = callFunction(extFunction.getFunctionName(), args, extFunction.getMethodKey(), 
+                                                                                                     exprContext);    
+          }
+      }
+      catch (SAXException ex) {
+          throw new TransformerException(ex);   
+      }
+      
+      return funcEvalResult;
+      
   }
 
   /**
diff --git a/src/org/apache/xpath/compiler/Compiler.java b/src/org/apache/xpath/compiler/Compiler.java
index d3ce8db2..d56e8560 100644
--- a/src/org/apache/xpath/compiler/Compiler.java
+++ b/src/org/apache/xpath/compiler/Compiler.java
@@ -59,6 +59,9 @@ import org.apache.xpath.operations.Range;
 import org.apache.xpath.operations.UnaryOperation;
 import org.apache.xpath.operations.Variable;
 import org.apache.xpath.operations.VcEquals;
+import org.apache.xpath.operations.VcGe;
+import org.apache.xpath.operations.VcGt;
+import org.apache.xpath.operations.VcLe;
 import org.apache.xpath.operations.VcLt;
 import org.apache.xpath.operations.VcNotEquals;
 import org.apache.xpath.patterns.FunctionPattern;
@@ -140,6 +143,12 @@ public class Compiler extends OpMap
       expr = vcNotEquals(opPos); break;
     case OpCodes.OP_VC_LT :
       expr = vcLt(opPos); break;
+    case OpCodes.OP_VC_GT :
+      expr = vcGt(opPos); break;
+    case OpCodes.OP_VC_LE :
+      expr = vcLe(opPos); break;
+    case OpCodes.OP_VC_GE :
+      expr = vcGe(opPos); break;
     case OpCodes.OP_LTE :
       expr = lte(opPos); break;
     case OpCodes.OP_LT :
@@ -359,6 +368,33 @@ public class Compiler extends OpMap
   {
     return compileOperation(new VcLt(), opPos);
   }
+  
+  /**
+   * Compile an XPath 3.1 value comparison 'gt' operation.
+   *  
+   */
+  protected Expression vcGt(int opPos) throws TransformerException
+  {
+    return compileOperation(new VcGt(), opPos);
+  }
+  
+  /**
+   * Compile an XPath 3.1 value comparison 'le' operation.
+   *  
+   */
+  protected Expression vcLe(int opPos) throws TransformerException
+  {
+    return compileOperation(new VcLe(), opPos);
+  }
+  
+  /**
+   * Compile an XPath 3.1 value comparison 'ge' operation.
+   *  
+   */
+  protected Expression vcGe(int opPos) throws TransformerException
+  {
+    return compileOperation(new VcGe(), opPos);
+  }
 
   /**
    * Compile a '>=' operation.
diff --git a/src/org/apache/xpath/compiler/OpCodes.java b/src/org/apache/xpath/compiler/OpCodes.java
index 80d07447..82076356 100644
--- a/src/org/apache/xpath/compiler/OpCodes.java
+++ b/src/org/apache/xpath/compiler/OpCodes.java
@@ -654,8 +654,29 @@ public class OpCodes
    * @xsl.usage advanced
    */
   public static final int OP_VC_LT = 57;
+  
+  /**
+   * For XPath 3.1 value comparison operator "gt".
+   * 
+   * @xsl.usage advanced
+   */
+  public static final int OP_VC_GT = 58;
+  
+  /**
+   * For XPath 3.1 value comparison operator "le".
+   * 
+   * @xsl.usage advanced
+   */
+  public static final int OP_VC_LE = 59;
+  
+  /**
+   * For XPath 3.1 value comparison operator "ge".
+   * 
+   * @xsl.usage advanced
+   */
+  public static final int OP_VC_GE = 60;
 
   /** The next free ID. Please keep this up to date. */
-  private static final int NEXT_FREE_ID = 58;
+  private static final int NEXT_FREE_ID = 61;
   
 }
diff --git a/src/org/apache/xpath/compiler/XPathParser.java b/src/org/apache/xpath/compiler/XPathParser.java
index b697beb4..ec199d32 100644
--- a/src/org/apache/xpath/compiler/XPathParser.java
+++ b/src/org/apache/xpath/compiler/XPathParser.java
@@ -1032,6 +1032,51 @@ public class XPathParser
 
           int op1 = m_ops.getOp(OpMap.MAPINDEX_LENGTH) - addPos;
 
+          addPos = RelationalExpr(addPos);
+          m_ops.setOp(addPos + OpMap.MAPINDEX_LENGTH,
+             m_ops.getOp(addPos + op1 + 1) + op1);
+          addPos += 2;
+      }
+      else if (tokenIs("gt"))
+      {
+          // support for XPath 3.1 value comparison operator "gt"
+          
+          nextToken();
+        
+          insertOp(addPos, 2, OpCodes.OP_VC_GT);
+
+          int op1 = m_ops.getOp(OpMap.MAPINDEX_LENGTH) - addPos;
+
+          addPos = RelationalExpr(addPos);
+          m_ops.setOp(addPos + OpMap.MAPINDEX_LENGTH,
+             m_ops.getOp(addPos + op1 + 1) + op1);
+          addPos += 2;
+      }
+      else if (tokenIs("le"))
+      {
+          // support for XPath 3.1 value comparison operator "le"
+          
+          nextToken();
+        
+          insertOp(addPos, 2, OpCodes.OP_VC_LE);
+
+          int op1 = m_ops.getOp(OpMap.MAPINDEX_LENGTH) - addPos;
+
+          addPos = RelationalExpr(addPos);
+          m_ops.setOp(addPos + OpMap.MAPINDEX_LENGTH,
+             m_ops.getOp(addPos + op1 + 1) + op1);
+          addPos += 2;
+      }
+      else if (tokenIs("ge"))
+      {
+          // support for XPath 3.1 value comparison operator "ge"
+          
+          nextToken();
+        
+          insertOp(addPos, 2, OpCodes.OP_VC_GE);
+
+          int op1 = m_ops.getOp(OpMap.MAPINDEX_LENGTH) - addPos;
+
           addPos = RelationalExpr(addPos);
           m_ops.setOp(addPos + OpMap.MAPINDEX_LENGTH,
              m_ops.getOp(addPos + op1 + 1) + op1);
diff --git a/src/org/apache/xpath/objects/XObject.java b/src/org/apache/xpath/objects/XObject.java
index 79c2415c..d7f38c8b 100644
--- a/src/org/apache/xpath/objects/XObject.java
+++ b/src/org/apache/xpath/objects/XObject.java
@@ -565,19 +565,22 @@ public class XObject extends Expression implements Serializable, Cloneable
    *
    * @param obj2                Object to compare this to
    * @param expressionOwner     this object is used, for error reporting 
+   * @param isLtTest            is this method called, to check "lt" or "ge"
+   *                            operation. true, if that's "lt" check and false
+   *                            otherwise. 
    *
    * @return True if this object is less than the given object
    *
    * @throws javax.xml.transform.TransformerException
    * 
-   * Notes : Currently, we don't implement following XPath 3.1 spec definitions for
-   *         value comparison operator "lt",
-   *         1) XPath 3.1 spec, requires atomizing the operands of XPath operator "lt",
-   *            before applying operator "lt" to the operands.
-   *         2) If any of the operands of operator "lt", after atomization is an empty
-   *            sequence, the result of operation "lt" should be an empty sequence.              
-   */
-  public boolean vcLessThan(XObject obj2, ExpressionNode expressionOwner) throws 
+   * Notes : Currently, we haven't implemented following XPath 3.1 spec definitions for
+   *         value comparison operator "lt"/"ge",
+   *         1) XPath 3.1 spec, requires atomizing the operands of XPath operator "lt"/"ge",
+   *            before applying operator "lt"/"ge" to the operands.
+   *         2) If any of the operands of operator "lt"/"ge", after atomization is an empty
+   *            sequence, the result of operation "lt"/"ge" should be an empty sequence.              
+   */
+  public boolean vcLessThan(XObject obj2, ExpressionNode expressionOwner, boolean isLtTest) throws 
                                                                     javax.xml.transform.TransformerException {
        
        if ((this instanceof XSDecimal) && (obj2 instanceof XSDecimal)) {
@@ -611,14 +614,16 @@ public class XObject extends Expression implements Serializable, Cloneable
        if (this.getType() == XObject.CLASS_NODESET) {       
           isOperandNodeSet1 = true;
           if ((((XNodeSet)this).getLength() > 1)) {
-              error(XPATHErrorResources.ER_EQ_OPERAND_CARDINALITY_ERROR, null, expressionOwner);    
+              error(isLtTest ? XPATHErrorResources.ER_LT_OPERAND_CARDINALITY_ERROR : 
+                                                              XPATHErrorResources.ER_GE_OPERAND_CARDINALITY_ERROR, null, expressionOwner);
           }
        }
        
        if (obj2.getType() == XObject.CLASS_NODESET) {
           isOperandNodeSet2 = true; 
           if ((((XNodeSet)obj2).getLength() > 1)) {
-              error(XPATHErrorResources.ER_EQ_OPERAND_CARDINALITY_ERROR, null, expressionOwner);    
+              error(isLtTest ? XPATHErrorResources.ER_LT_OPERAND_CARDINALITY_ERROR : 
+                                                              XPATHErrorResources.ER_GE_OPERAND_CARDINALITY_ERROR, null, expressionOwner);    
           }
        }
        
@@ -629,7 +634,84 @@ public class XObject extends Expression implements Serializable, Cloneable
            return obj2.num() < this.num();    
        }
        
-       // revisit
+       return true;
+  }
+  
+  /**
+   * Tell if one object is greater than an another one, using the rules 
+   * of value comparison operator "gt".
+   *
+   * @param obj2                Object to compare this to
+   * @param expressionOwner     this object is used, for error reporting 
+   * @param isGtTest            is this method called, to check "gt" or "le"
+   *                            operation. true, if that's "gt" check and false
+   *                            otherwise.
+   *
+   * @return True if this object is greater than the given object
+   *
+   * @throws javax.xml.transform.TransformerException
+   * 
+   * Notes : Currently, we haven't implemented following XPath 3.1 spec definitions for
+   *         value comparison operator "gt"/"le",
+   *         1) XPath 3.1 spec, requires atomizing the operands of XPath operator "gt"/"le",
+   *            before applying operator "gt"/"le" to the operands.
+   *         2) If any of the operands of operator "gt"/"le", after atomization is an empty
+   *            sequence, the result of operation "gt"/"le" should be an empty sequence.              
+   */
+  public boolean vcGreaterThan(XObject obj2, ExpressionNode expressionOwner, boolean isGtTest) throws 
+                                                                    javax.xml.transform.TransformerException {
+       
+       if ((this instanceof XSDecimal) && (obj2 instanceof XSDecimal)) {
+          return ((XSDecimal)this).gt((XSDecimal)obj2);        
+       }
+       else if ((this instanceof XSFloat) && (obj2 instanceof XSFloat)) {
+          return ((XSFloat)this).gt((XSFloat)obj2);        
+       }
+       else if ((this instanceof XSDouble) && (obj2 instanceof XSDouble)) {
+          return ((XSDouble)this).gt((XSDouble)obj2);        
+       }
+       else if ((this instanceof XSBoolean) && (obj2 instanceof XSBoolean)) {
+          return ((XSBoolean)this).gt((XSBoolean)obj2);    
+       }
+       else if ((this instanceof XSInteger) && (obj2 instanceof XSInteger)) {
+          return ((XSInteger)this).gt((XSInteger)obj2);    
+       }
+       else if ((this instanceof XSLong) && (obj2 instanceof XSLong)) {
+          return ((XSLong)this).gt((XSLong)obj2);    
+       }
+       else if ((this instanceof XSInt) && (obj2 instanceof XSInt)) {
+          return ((XSInt)this).gt((XSInt)obj2);    
+       }
+       else if ((this instanceof XSDate) && (obj2 instanceof XSDate)) {
+           return ((XSDate)this).gt((XSDate)obj2);    
+       }
+       
+       boolean isOperandNodeSet1 = false;
+       boolean isOperandNodeSet2 = false;
+       
+       if (this.getType() == XObject.CLASS_NODESET) {       
+          isOperandNodeSet1 = true;
+          if ((((XNodeSet)this).getLength() > 1)) {
+              error(isGtTest ? XPATHErrorResources.ER_GT_OPERAND_CARDINALITY_ERROR : 
+                                                              XPATHErrorResources.ER_LE_OPERAND_CARDINALITY_ERROR, null, expressionOwner);
+          }
+       }
+       
+       if (obj2.getType() == XObject.CLASS_NODESET) {
+          isOperandNodeSet2 = true; 
+          if ((((XNodeSet)obj2).getLength() > 1)) {
+              error(isGtTest ? XPATHErrorResources.ER_GT_OPERAND_CARDINALITY_ERROR : 
+                                                              XPATHErrorResources.ER_LE_OPERAND_CARDINALITY_ERROR, null, expressionOwner);    
+          }
+       }
+       
+       if (isOperandNodeSet1 || this instanceof XNumber) {
+           return this.num() > obj2.num();    
+       }    
+       else if (isOperandNodeSet2 || obj2 instanceof XNumber) {
+           return obj2.num() > this.num();    
+       }
+       
        return true;
   }
 
@@ -759,20 +841,23 @@ public class XObject extends Expression implements Serializable, Cloneable
    *
    * @param obj2                Object to compare this to
    * @param expressionOwner     this object is used, for error reporting 
+   * @param isEqTest            is this method called, to check "eq" or "ne"
+   *                            operation. true, if that's "eq" check and false
+   *                            otherwise. 
    *
    * @return True if this object is equal to the given object
    *
    * @throws javax.xml.transform.TransformerException
    * 
-   * Notes : Currently, we don't implement following XPath 3.1 spec definitions for
-   *         value comparison operator "eq",
-   *         1) XPath 3.1 spec, requires atomizing the operands of XPath operator "eq",
-   *            before applying operator "eq" to the operands.
-   *         2) If any of the operands of operator "eq", after atomization is an empty
-   *            sequence, the result of operation "eq" should be an empty sequence. 
+   * Notes : Currently, we haven't implemented following XPath 3.1 spec definitions for
+   *         value comparison operator "eq"/"ne",
+   *         1) XPath 3.1 spec, requires atomizing the operands of XPath operator "eq"/"ne",
+   *            before applying operator "eq"/"ne" to the operands.
+   *         2) If any of the operands of operator "eq"/"ne", after atomization is an empty
+   *            sequence, the result of operation "eq"/"ne" should be an empty sequence. 
    *            Instead, we return the result as false for such cases.  
    */
-  public boolean vcEquals(XObject obj2, ExpressionNode expressionOwner) 
+  public boolean vcEquals(XObject obj2, ExpressionNode expressionOwner, boolean isEqTest) 
                                                                throws javax.xml.transform.TransformerException
   {
     if ((this instanceof XSDecimal) && (obj2 instanceof XSDecimal)) {
@@ -806,14 +891,16 @@ public class XObject extends Expression implements Serializable, Cloneable
     if (this.getType() == XObject.CLASS_NODESET) {       
        isOperandNodeSet1 = true;
        if ((((XNodeSet)this).getLength() > 1)) {
-           error(XPATHErrorResources.ER_EQ_OPERAND_CARDINALITY_ERROR, null, expressionOwner);    
+           error(isEqTest ? XPATHErrorResources.ER_EQ_OPERAND_CARDINALITY_ERROR : 
+                                                           XPATHErrorResources.ER_NE_OPERAND_CARDINALITY_ERROR, null, expressionOwner);    
        }
     }
     
     if (obj2.getType() == XObject.CLASS_NODESET) {
        isOperandNodeSet2 = true; 
        if ((((XNodeSet)obj2).getLength() > 1)) {
-           error(XPATHErrorResources.ER_EQ_OPERAND_CARDINALITY_ERROR, null, expressionOwner);    
+           error(isEqTest ? XPATHErrorResources.ER_EQ_OPERAND_CARDINALITY_ERROR : 
+                                                           XPATHErrorResources.ER_NE_OPERAND_CARDINALITY_ERROR, null, expressionOwner);    
        }
     }
     
diff --git a/src/org/apache/xpath/operations/VcEquals.java b/src/org/apache/xpath/operations/VcEquals.java
index 2092d9c6..881751d0 100644
--- a/src/org/apache/xpath/operations/VcEquals.java
+++ b/src/org/apache/xpath/operations/VcEquals.java
@@ -46,7 +46,7 @@ public class VcEquals extends Operation
   public XObject operate(XObject left, XObject right) throws 
                                                   javax.xml.transform.TransformerException
   {    
-      return left.vcEquals(right, getExpressionOwner()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+      return left.vcEquals(right, getExpressionOwner(), true) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
   }
 
 }
diff --git a/src/org/apache/xpath/operations/VcLt.java b/src/org/apache/xpath/operations/VcGe.java
similarity index 89%
copy from src/org/apache/xpath/operations/VcLt.java
copy to src/org/apache/xpath/operations/VcGe.java
index 0928099b..aaa54f51 100644
--- a/src/org/apache/xpath/operations/VcLt.java
+++ b/src/org/apache/xpath/operations/VcGe.java
@@ -24,13 +24,13 @@ import org.apache.xpath.objects.XBoolean;
 import org.apache.xpath.objects.XObject;
 
 /**
- * The XPath 3.1 value comparison "lt" operation.
+ * The XPath 3.1 value comparison "ge" operation.
  * 
  * @author Mukul Gandhi <mu...@apache.org>
  * 
  * @xsl.usage advanced
  */
-public class VcLt extends Operation
+public class VcGe extends Operation
 {
 
    private static final long serialVersionUID = 3832212036565766741L;
@@ -49,6 +49,6 @@ public class VcLt extends Operation
   public XObject operate(XObject left, XObject right) 
                                                  throws javax.xml.transform.TransformerException
   {
-      return left.vcLessThan(right, getExpressionOwner()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+      return left.vcLessThan(right, getExpressionOwner(), false) ? XBoolean.S_FALSE : XBoolean.S_TRUE;
   }
 }
diff --git a/src/org/apache/xpath/operations/VcLt.java b/src/org/apache/xpath/operations/VcGt.java
similarity index 89%
copy from src/org/apache/xpath/operations/VcLt.java
copy to src/org/apache/xpath/operations/VcGt.java
index 0928099b..43a0f6c2 100644
--- a/src/org/apache/xpath/operations/VcLt.java
+++ b/src/org/apache/xpath/operations/VcGt.java
@@ -24,13 +24,13 @@ import org.apache.xpath.objects.XBoolean;
 import org.apache.xpath.objects.XObject;
 
 /**
- * The XPath 3.1 value comparison "lt" operation.
+ * The XPath 3.1 value comparison "gt" operation.
  * 
  * @author Mukul Gandhi <mu...@apache.org>
  * 
  * @xsl.usage advanced
  */
-public class VcLt extends Operation
+public class VcGt extends Operation
 {
 
    private static final long serialVersionUID = 3832212036565766741L;
@@ -49,6 +49,6 @@ public class VcLt extends Operation
   public XObject operate(XObject left, XObject right) 
                                                  throws javax.xml.transform.TransformerException
   {
-      return left.vcLessThan(right, getExpressionOwner()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+      return left.vcGreaterThan(right, getExpressionOwner(), true) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
   }
 }
diff --git a/src/org/apache/xpath/operations/VcLt.java b/src/org/apache/xpath/operations/VcLe.java
similarity index 89%
copy from src/org/apache/xpath/operations/VcLt.java
copy to src/org/apache/xpath/operations/VcLe.java
index 0928099b..67372a01 100644
--- a/src/org/apache/xpath/operations/VcLt.java
+++ b/src/org/apache/xpath/operations/VcLe.java
@@ -24,13 +24,13 @@ import org.apache.xpath.objects.XBoolean;
 import org.apache.xpath.objects.XObject;
 
 /**
- * The XPath 3.1 value comparison "lt" operation.
+ * The XPath 3.1 value comparison "le" operation.
  * 
  * @author Mukul Gandhi <mu...@apache.org>
  * 
  * @xsl.usage advanced
  */
-public class VcLt extends Operation
+public class VcLe extends Operation
 {
 
    private static final long serialVersionUID = 3832212036565766741L;
@@ -49,6 +49,6 @@ public class VcLt extends Operation
   public XObject operate(XObject left, XObject right) 
                                                  throws javax.xml.transform.TransformerException
   {
-      return left.vcLessThan(right, getExpressionOwner()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+      return left.vcGreaterThan(right, getExpressionOwner(), false) ? XBoolean.S_FALSE : XBoolean.S_TRUE;
   }
 }
diff --git a/src/org/apache/xpath/operations/VcLt.java b/src/org/apache/xpath/operations/VcLt.java
index 0928099b..3412f133 100644
--- a/src/org/apache/xpath/operations/VcLt.java
+++ b/src/org/apache/xpath/operations/VcLt.java
@@ -49,6 +49,6 @@ public class VcLt extends Operation
   public XObject operate(XObject left, XObject right) 
                                                  throws javax.xml.transform.TransformerException
   {
-      return left.vcLessThan(right, getExpressionOwner()) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
+      return left.vcLessThan(right, getExpressionOwner(), true) ? XBoolean.S_TRUE : XBoolean.S_FALSE;
   }
 }
diff --git a/src/org/apache/xpath/operations/VcNotEquals.java b/src/org/apache/xpath/operations/VcNotEquals.java
index 35bc7bd5..da447b55 100644
--- a/src/org/apache/xpath/operations/VcNotEquals.java
+++ b/src/org/apache/xpath/operations/VcNotEquals.java
@@ -46,7 +46,7 @@ public class VcNotEquals extends Operation
   public XObject operate(XObject left, XObject right) throws 
                                                   javax.xml.transform.TransformerException
   {    
-      return left.vcEquals(right, getExpressionOwner()) ? XBoolean.S_FALSE : XBoolean.S_TRUE;
+      return left.vcEquals(right, getExpressionOwner(), false) ? XBoolean.S_FALSE : XBoolean.S_TRUE;
   }
 
 }
diff --git a/src/org/apache/xpath/res/XPATHErrorResources.java b/src/org/apache/xpath/res/XPATHErrorResources.java
index db64c362..eeed93a3 100644
--- a/src/org/apache/xpath/res/XPATHErrorResources.java
+++ b/src/org/apache/xpath/res/XPATHErrorResources.java
@@ -370,6 +370,16 @@ public static final String ER_IGNORABLE_WHITESPACE_NOT_HANDLED =
   public static final String ER_INVALID_REGEX = "ER_INVALID_REGEX";
   
   public static final String ER_EQ_OPERAND_CARDINALITY_ERROR = "ER_EQ_OPERAND_CARDINALITY_ERROR";
+  
+  public static final String ER_NE_OPERAND_CARDINALITY_ERROR = "ER_NE_OPERAND_CARDINALITY_ERROR";
+  
+  public static final String ER_LT_OPERAND_CARDINALITY_ERROR = "ER_LT_OPERAND_CARDINALITY_ERROR";
+  
+  public static final String ER_GT_OPERAND_CARDINALITY_ERROR = "ER_GT_OPERAND_CARDINALITY_ERROR";
+  
+  public static final String ER_LE_OPERAND_CARDINALITY_ERROR = "ER_LE_OPERAND_CARDINALITY_ERROR";
+  
+  public static final String ER_GE_OPERAND_CARDINALITY_ERROR = "ER_GE_OPERAND_CARDINALITY_ERROR";
 
   // Error messages...
 
@@ -863,8 +873,23 @@ public static final String ER_IGNORABLE_WHITESPACE_NOT_HANDLED =
   
   { ER_EQ_OPERAND_CARDINALITY_ERROR,
        "XPTY0004 : none of the eq's operands can be a sequence with length greater than one."},
+  
+  { ER_NE_OPERAND_CARDINALITY_ERROR,
+       "XPTY0004 : none of the ne's operands can be a sequence with length greater than one."},
+  
+  { ER_LT_OPERAND_CARDINALITY_ERROR,
+       "XPTY0004 : none of the lt's operands can be a sequence with length greater than one."},
+  
+  { ER_GT_OPERAND_CARDINALITY_ERROR,
+       "XPTY0004 : none of the gt's operands can be a sequence with length greater than one."},
+  
+  { ER_LE_OPERAND_CARDINALITY_ERROR,
+       "XPTY0004 : none of the le's operands can be a sequence with length greater than one."},
+  
+  { ER_GE_OPERAND_CARDINALITY_ERROR,
+       "XPTY0004 : none of the ge's operands can be a sequence with length greater than one."},
 
-  //END:  Definitions of error keys used  in exception messages of JAXP 1.3 XPath API implementation
+  //END:  Definitions of error keys used in exception messages of JAXP 1.3 XPath API implementation
 
   // Warnings...
 
diff --git a/tests/org/apache/xalan/xpath3/ValueComparisonTests.java b/tests/org/apache/xalan/xpath3/ValueComparisonTests.java
index 2d639ce2..37de4627 100644
--- a/tests/org/apache/xalan/xpath3/ValueComparisonTests.java
+++ b/tests/org/apache/xalan/xpath3/ValueComparisonTests.java
@@ -119,5 +119,75 @@ public class ValueComparisonTests extends XslTransformTestsUtil {
         
         runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
     }
+    
+    @Test
+    public void xslValueComparison8() {
+        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test8.xsl"; 
+        String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test8.xsl";
+        
+        String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test8.out";                
+        
+        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
+    }
+    
+    @Test
+    public void xslValueComparison9() {
+        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test9.xsl"; 
+        String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test9.xsl";
+        
+        String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test9.out";                
+        
+        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
+    }
+    
+    @Test
+    public void xslValueComparison10() {
+        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test10.xsl"; 
+        String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test10.xsl";
+        
+        String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test10.out";                
+        
+        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
+    }
+    
+    @Test
+    public void xslValueComparison11() {
+        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test1_c.xml"; 
+        String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test11.xsl";
+        
+        String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test11.out";                
+        
+        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
+    }
+    
+    @Test
+    public void xslValueComparison12() {
+        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test1_d.xml"; 
+        String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test12.xsl";
+        
+        String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test12.out";                
+        
+        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
+    }
+    
+    @Test
+    public void xslValueComparison13() {
+        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test1_e.xml"; 
+        String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test13.xsl";
+        
+        String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test13.out";                
+        
+        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
+    }
+    
+    @Test
+    public void xslValueComparison14() {
+        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test1_e.xml"; 
+        String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test14.xsl";
+        
+        String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test14.out";                
+        
+        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
+    }
 
 }
diff --git a/tests/org/apache/xalan/xslt3/XSLConstants.java b/tests/org/apache/xalan/xslt3/XSLConstants.java
index ccaf7dab..c85a98db 100644
--- a/tests/org/apache/xalan/xslt3/XSLConstants.java
+++ b/tests/org/apache/xalan/xslt3/XSLConstants.java
@@ -36,8 +36,8 @@ public class XSLConstants {
     // the values of following, two variables are host specific where this test suite shall be run. the values of
     // following two variables may be modified, accordingly.
     
-    public static final String XSL_TRANSFORM_INPUT_DIRPATH_PREFIX = "file:///d:/eclipseWorkspaces/xalanj/xalan-java_mukul/tests/";
+    public static final String XSL_TRANSFORM_INPUT_DIRPATH_PREFIX = "file:///d:/eclipseWorkspaces/xalanj/xalan-java/tests/";
     
-    public static final String XSL_TRANSFORM_GOLD_DIRPATH_PREFIX = "d:/eclipseWorkspaces/xalanj/xalan-java_mukul/tests/";
+    public static final String XSL_TRANSFORM_GOLD_DIRPATH_PREFIX = "d:/eclipseWorkspaces/xalanj/xalan-java/tests/";
 
 }
diff --git a/tests/org/apache/xalan/xslt3/XslIterateTests.java b/tests/org/apache/xalan/xslt3/XslIterateTests.java
index 3ef89058..d0be3be0 100644
--- a/tests/org/apache/xalan/xslt3/XslIterateTests.java
+++ b/tests/org/apache/xalan/xslt3/XslIterateTests.java
@@ -200,5 +200,15 @@ public class XslIterateTests extends XslTransformTestsUtil {
         
         runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
     }
+    
+    @Test
+    public void xslIterateTest16() {
+        String xmlFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test1_e.xml"; 
+        String xslFilePath = XSL_TRANSFORM_INPUT_DIRPATH + "test14.xsl";
+        
+        String goldFilePath = XSL_TRANSFORM_GOLD_DIRPATH + "test14.out";                
+        
+        runXslTransformAndAssertOutput(xmlFilePath, xslFilePath, goldFilePath, null);
+    }
 
 }
diff --git a/tests/xpath_value_comparison/gold/test10.out b/tests/xpath_value_comparison/gold/test10.out
new file mode 100644
index 00000000..ebd80f74
--- /dev/null
+++ b/tests/xpath_value_comparison/gold/test10.out
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?><elem>
+  <result1>true</result1>
+  <result2>false</result2>
+  <result3>true</result3>
+</elem>
diff --git a/tests/xpath_value_comparison/gold/test11.out b/tests/xpath_value_comparison/gold/test11.out
new file mode 100644
index 00000000..88a36785
--- /dev/null
+++ b/tests/xpath_value_comparison/gold/test11.out
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?><result>
+  <chk1>
+    <a>hello</a>
+    <a>hello</a>
+  </chk1>
+  <chk2>
+    <a>hi</a>
+    <a>hi</a>
+    <a>hi</a>
+  </chk2>
+  <chk3>
+    <a>there</a>
+  </chk3>
+</result>
diff --git a/tests/xpath_value_comparison/gold/test12.out b/tests/xpath_value_comparison/gold/test12.out
new file mode 100644
index 00000000..8f3c94db
--- /dev/null
+++ b/tests/xpath_value_comparison/gold/test12.out
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?><result>
+  <before>
+    <a dt="2007-10-07">1</a>
+    <a dt="2008-10-07">3</a>
+    <a dt="2009-10-07">5</a>
+  </before>
+  <after>
+    <a dt="2500-10-07">2</a>
+    <a dt="2501-10-07">4</a>
+    <a dt="2502-10-07">6</a>
+  </after>
+</result>
diff --git a/tests/xpath_value_comparison/gold/test13.out b/tests/xpath_value_comparison/gold/test13.out
new file mode 100644
index 00000000..00b4154d
--- /dev/null
+++ b/tests/xpath_value_comparison/gold/test13.out
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?><result>
+  <lessOrEqual>
+    <item weight="5">A</item>
+    <item weight="6">B</item>
+    <item weight="7">C</item>
+    <item weight="8">D</item>
+    <item weight="9">E</item>
+    <item weight="10">F</item>
+  </lessOrEqual>
+  <greaterThan>
+    <item weight="11">G</item>
+    <item weight="12">H</item>
+    <item weight="13">I</item>
+    <item weight="14">J</item>
+  </greaterThan>
+</result>
diff --git a/tests/xpath_value_comparison/gold/test14.out b/tests/xpath_value_comparison/gold/test14.out
new file mode 100644
index 00000000..1e61bf84
--- /dev/null
+++ b/tests/xpath_value_comparison/gold/test14.out
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?><result>
+  <lessThan>
+    <item weight="5">A</item>
+    <item weight="6">B</item>
+    <item weight="7">C</item>
+    <item weight="8">D</item>
+    <item weight="9">E</item>
+  </lessThan>
+  <greaterOrEqual>
+    <item weight="10">F</item>
+    <item weight="11">G</item>
+    <item weight="12">H</item>
+    <item weight="13">I</item>
+    <item weight="14">J</item>
+  </greaterOrEqual>
+</result>
diff --git a/tests/xpath_value_comparison/gold/test8.out b/tests/xpath_value_comparison/gold/test8.out
new file mode 100644
index 00000000..d2f51c73
--- /dev/null
+++ b/tests/xpath_value_comparison/gold/test8.out
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?><elem>
+  <result1>true</result1>
+  <result2>false</result2>
+  <result3>false</result3>
+</elem>
diff --git a/tests/xpath_value_comparison/gold/test9.out b/tests/xpath_value_comparison/gold/test9.out
new file mode 100644
index 00000000..dcc4489f
--- /dev/null
+++ b/tests/xpath_value_comparison/gold/test9.out
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?><elem>
+  <result1>false</result1>
+  <result2>true</result2>
+  <result3>true</result3>
+</elem>
diff --git a/tests/xpath_value_comparison/test10.xsl b/tests/xpath_value_comparison/test10.xsl
new file mode 100644
index 00000000..f5e62901
--- /dev/null
+++ b/tests/xpath_value_comparison/test10.xsl
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                version="3.0">
+                
+   <!-- Author: mukulg@apache.org -->
+   
+   <!-- An XSLT stylesheet to test, implementation of XPath 3.1 value 
+        comparison operator 'ge'. -->                
+
+   <xsl:output method="xml" indent="yes"/>
+
+   <xsl:template match="/">
+      <elem>
+        <result1><xsl:value-of select="2 ge 1"/></result1>
+        <result2><xsl:value-of select="1 ge 2"/></result2>
+        <result3><xsl:value-of select="1 ge 1"/></result3>
+      </elem>
+   </xsl:template>
+   
+   <!--
+      * Licensed to the Apache Software Foundation (ASF) under one
+      * or more contributor license agreements. See the NOTICE file
+      * distributed with this work for additional information
+      * regarding copyright ownership. The ASF licenses this file
+      * to you under the Apache License, Version 2.0 (the  "License");
+      * you may not use this file except in compliance with the License.
+      * You may obtain a copy of the License at
+      *
+      *     http://www.apache.org/licenses/LICENSE-2.0
+      *
+      * Unless required by applicable law or agreed to in writing, software
+      * distributed under the License is distributed on an "AS IS" BASIS,
+      * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      * See the License for the specific language governing permissions and
+      * limitations under the License.
+   -->
+
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/tests/xpath_value_comparison/test11.xsl b/tests/xpath_value_comparison/test11.xsl
new file mode 100644
index 00000000..10cf3b5c
--- /dev/null
+++ b/tests/xpath_value_comparison/test11.xsl
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                version="3.0">
+                
+   <!-- Author: mukulg@apache.org -->
+   
+   <!-- use with test1_c.xml -->
+   
+   <!-- An XSLT stylesheet to test, implementation of XPath 3.1 value 
+        comparison operator 'eq'. -->                
+
+   <xsl:output method="xml" indent="yes"/>
+
+   <xsl:template match="/elem">
+      <result>
+         <chk1>
+            <xsl:copy-of select="a[. eq /elem/@chk1]"/>
+         </chk1>
+         <chk2>
+	        <xsl:copy-of select="a[. eq /elem/@chk2]"/>
+         </chk2>
+         <chk3>
+	        <xsl:copy-of select="a[. eq /elem/@chk3]"/>
+         </chk3>
+      </result>
+   </xsl:template>
+   
+   <!--
+      * Licensed to the Apache Software Foundation (ASF) under one
+      * or more contributor license agreements. See the NOTICE file
+      * distributed with this work for additional information
+      * regarding copyright ownership. The ASF licenses this file
+      * to you under the Apache License, Version 2.0 (the  "License");
+      * you may not use this file except in compliance with the License.
+      * You may obtain a copy of the License at
+      *
+      *     http://www.apache.org/licenses/LICENSE-2.0
+      *
+      * Unless required by applicable law or agreed to in writing, software
+      * distributed under the License is distributed on an "AS IS" BASIS,
+      * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      * See the License for the specific language governing permissions and
+      * limitations under the License.
+   -->
+
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/tests/xpath_value_comparison/test12.xsl b/tests/xpath_value_comparison/test12.xsl
new file mode 100644
index 00000000..b7f9c5c7
--- /dev/null
+++ b/tests/xpath_value_comparison/test12.xsl
@@ -0,0 +1,47 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:xs="http://www.w3.org/2001/XMLSchema"
+                exclude-result-prefixes="xs"
+                version="3.0">
+                
+   <!-- Author: mukulg@apache.org -->
+   
+   <!-- use with test1_d.xml -->
+   
+   <!-- An XSLT stylesheet to test, implementation of XPath 3.1 value 
+        comparison operator 'lt'. -->                 
+
+   <xsl:output method="xml" indent="yes"/>
+   
+   <xsl:variable name="currDate" select="current-date()"/>
+
+   <xsl:template match="/elem">
+      <result>
+        <before>
+           <xsl:copy-of select="a[xs:date(@dt) lt $currDate]"/>
+        </before>
+        <after>
+	       <xsl:copy-of select="a[xs:date(@dt) gt $currDate]"/>
+        </after>
+      </result>
+   </xsl:template>
+   
+   <!--
+      * Licensed to the Apache Software Foundation (ASF) under one
+      * or more contributor license agreements. See the NOTICE file
+      * distributed with this work for additional information
+      * regarding copyright ownership. The ASF licenses this file
+      * to you under the Apache License, Version 2.0 (the  "License");
+      * you may not use this file except in compliance with the License.
+      * You may obtain a copy of the License at
+      *
+      *     http://www.apache.org/licenses/LICENSE-2.0
+      *
+      * Unless required by applicable law or agreed to in writing, software
+      * distributed under the License is distributed on an "AS IS" BASIS,
+      * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      * See the License for the specific language governing permissions and
+      * limitations under the License.
+   -->
+
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/tests/xpath_value_comparison/test13.xsl b/tests/xpath_value_comparison/test13.xsl
new file mode 100644
index 00000000..b542644b
--- /dev/null
+++ b/tests/xpath_value_comparison/test13.xsl
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                version="3.0">
+                
+   <!-- Author: mukulg@apache.org -->
+   
+   <!-- use with test1_e.xml -->
+   
+   <!-- An XSLT stylesheet to test, implementation of XPath 3.1 value 
+        comparison operators 'le' and 'gt'. -->                 
+
+   <xsl:output method="xml" indent="yes"/>
+
+   <xsl:template match="/elem">
+      <result>
+        <lessOrEqual>
+           <xsl:copy-of select="item[number(@weight) le 10]"/>
+        </lessOrEqual>
+        <greaterThan>
+	       <xsl:copy-of select="item[number(@weight) gt 10]"/>
+        </greaterThan>
+      </result>
+   </xsl:template>
+   
+   <!--
+      * Licensed to the Apache Software Foundation (ASF) under one
+      * or more contributor license agreements. See the NOTICE file
+      * distributed with this work for additional information
+      * regarding copyright ownership. The ASF licenses this file
+      * to you under the Apache License, Version 2.0 (the  "License");
+      * you may not use this file except in compliance with the License.
+      * You may obtain a copy of the License at
+      *
+      *     http://www.apache.org/licenses/LICENSE-2.0
+      *
+      * Unless required by applicable law or agreed to in writing, software
+      * distributed under the License is distributed on an "AS IS" BASIS,
+      * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      * See the License for the specific language governing permissions and
+      * limitations under the License.
+   -->
+
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/tests/xpath_value_comparison/test14.xsl b/tests/xpath_value_comparison/test14.xsl
new file mode 100644
index 00000000..add294d8
--- /dev/null
+++ b/tests/xpath_value_comparison/test14.xsl
@@ -0,0 +1,43 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                version="3.0">
+                
+   <!-- Author: mukulg@apache.org -->
+   
+   <!-- use with test1_e.xml -->
+   
+   <!-- An XSLT stylesheet to test, implementation of XPath 3.1 value 
+        comparison operators 'lt' and 'ge'. -->                
+
+   <xsl:output method="xml" indent="yes"/>
+
+   <xsl:template match="/elem">
+      <result>
+        <lessThan>
+           <xsl:copy-of select="item[number(@weight) lt 10]"/>
+        </lessThan>
+        <greaterOrEqual>
+	       <xsl:copy-of select="item[number(@weight) ge 10]"/>
+        </greaterOrEqual>
+      </result>
+   </xsl:template>
+   
+   <!--
+      * Licensed to the Apache Software Foundation (ASF) under one
+      * or more contributor license agreements. See the NOTICE file
+      * distributed with this work for additional information
+      * regarding copyright ownership. The ASF licenses this file
+      * to you under the Apache License, Version 2.0 (the  "License");
+      * you may not use this file except in compliance with the License.
+      * You may obtain a copy of the License at
+      *
+      *     http://www.apache.org/licenses/LICENSE-2.0
+      *
+      * Unless required by applicable law or agreed to in writing, software
+      * distributed under the License is distributed on an "AS IS" BASIS,
+      * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      * See the License for the specific language governing permissions and
+      * limitations under the License.
+   -->
+
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/tests/xpath_value_comparison/test1_c.xml b/tests/xpath_value_comparison/test1_c.xml
new file mode 100644
index 00000000..96e12ee6
--- /dev/null
+++ b/tests/xpath_value_comparison/test1_c.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<elem chk1="hello" chk2="hi" chk3="there">
+   <a>hello</a>
+   <a>hello</a>
+   <a>hi</a>
+   <a>hi</a>
+   <a>hi</a>
+   <a>there</a>
+</elem>
\ No newline at end of file
diff --git a/tests/xpath_value_comparison/test1_d.xml b/tests/xpath_value_comparison/test1_d.xml
new file mode 100644
index 00000000..7aa2048f
--- /dev/null
+++ b/tests/xpath_value_comparison/test1_d.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<elem>
+   <a dt="2007-10-07">1</a>
+   <a dt="2500-10-07">2</a>
+   <a dt="2008-10-07">3</a>
+   <a dt="2501-10-07">4</a>
+   <a dt="2009-10-07">5</a>
+   <a dt="2502-10-07">6</a>
+</elem>
\ No newline at end of file
diff --git a/tests/xpath_value_comparison/test1_e.xml b/tests/xpath_value_comparison/test1_e.xml
new file mode 100644
index 00000000..c4fc37e9
--- /dev/null
+++ b/tests/xpath_value_comparison/test1_e.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<elem>
+   <item weight="5">A</item>
+   <item weight="6">B</item>
+   <item weight="7">C</item>
+   <item weight="8">D</item>
+   <item weight="9">E</item>
+   <item weight="10">F</item>
+   <item weight="11">G</item>
+   <item weight="12">H</item>
+   <item weight="13">I</item>
+   <item weight="14">J</item>
+</elem>
\ No newline at end of file
diff --git a/tests/xpath_value_comparison/test8.xsl b/tests/xpath_value_comparison/test8.xsl
new file mode 100644
index 00000000..ecbdce6c
--- /dev/null
+++ b/tests/xpath_value_comparison/test8.xsl
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                version="3.0">
+                
+   <!-- Author: mukulg@apache.org -->
+   
+   <!-- An XSLT stylesheet to test, implementation of XPath 3.1 value 
+        comparison operator 'gt'. -->                
+
+   <xsl:output method="xml" indent="yes"/>
+
+   <xsl:template match="/">
+      <elem>
+        <result1><xsl:value-of select="2 gt 1"/></result1>
+        <result2><xsl:value-of select="1 gt 2"/></result2>
+        <result3><xsl:value-of select="1 gt 1"/></result3>
+      </elem>
+   </xsl:template>
+   
+   <!--
+      * Licensed to the Apache Software Foundation (ASF) under one
+      * or more contributor license agreements. See the NOTICE file
+      * distributed with this work for additional information
+      * regarding copyright ownership. The ASF licenses this file
+      * to you under the Apache License, Version 2.0 (the  "License");
+      * you may not use this file except in compliance with the License.
+      * You may obtain a copy of the License at
+      *
+      *     http://www.apache.org/licenses/LICENSE-2.0
+      *
+      * Unless required by applicable law or agreed to in writing, software
+      * distributed under the License is distributed on an "AS IS" BASIS,
+      * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      * See the License for the specific language governing permissions and
+      * limitations under the License.
+   -->
+
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/tests/xpath_value_comparison/test9.xsl b/tests/xpath_value_comparison/test9.xsl
new file mode 100644
index 00000000..ff1c71e9
--- /dev/null
+++ b/tests/xpath_value_comparison/test9.xsl
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                version="3.0">
+                
+   <!-- Author: mukulg@apache.org -->
+   
+   <!-- An XSLT stylesheet to test, implementation of XPath 3.1 value 
+        comparison operator 'le'. -->                
+
+   <xsl:output method="xml" indent="yes"/>
+
+   <xsl:template match="/">
+      <elem>
+        <result1><xsl:value-of select="2 le 1"/></result1>
+        <result2><xsl:value-of select="1 le 2"/></result2>
+        <result3><xsl:value-of select="1 le 1"/></result3>
+      </elem>
+   </xsl:template>
+   
+   <!--
+      * Licensed to the Apache Software Foundation (ASF) under one
+      * or more contributor license agreements. See the NOTICE file
+      * distributed with this work for additional information
+      * regarding copyright ownership. The ASF licenses this file
+      * to you under the Apache License, Version 2.0 (the  "License");
+      * you may not use this file except in compliance with the License.
+      * You may obtain a copy of the License at
+      *
+      *     http://www.apache.org/licenses/LICENSE-2.0
+      *
+      * Unless required by applicable law or agreed to in writing, software
+      * distributed under the License is distributed on an "AS IS" BASIS,
+      * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      * See the License for the specific language governing permissions and
+      * limitations under the License.
+   -->
+
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/tests/xsl_iterate/gold/test14.out b/tests/xsl_iterate/gold/test14.out
new file mode 100644
index 00000000..b4d3b7dc
--- /dev/null
+++ b/tests/xsl_iterate/gold/test14.out
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?><result>
+  <item weight="5">A</item>
+  <item weight="6">B</item>
+  <item weight="7">C</item>
+  <item weight="8">D</item>
+  <item weight="9">E</item>
+  <item weight="10">F</item>
+</result>
diff --git a/tests/xsl_iterate/test14.xsl b/tests/xsl_iterate/test14.xsl
new file mode 100644
index 00000000..bb1933cb
--- /dev/null
+++ b/tests/xsl_iterate/test14.xsl
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                version="3.0">
+                
+   <!-- Author: mukulg@apache.org -->
+   
+   <!-- use with test1_e.xml -->
+   
+   <!-- An XSLT stylesheet to test, xsl:iterate instruction,
+        which breaks from xsl:iterate loop when a particular
+        condition becomes true. -->               
+
+   <xsl:output method="xml" indent="yes"/>
+
+   <xsl:template match="/elem">
+      <result>
+        <xsl:iterate select="item">
+           <xsl:choose>
+              <xsl:when test="number(@weight) eq 11">
+                 <xsl:break/>
+              </xsl:when>
+              <xsl:otherwise>
+                 <xsl:copy-of select="."/>
+              </xsl:otherwise>
+           </xsl:choose>
+        </xsl:iterate>
+      </result>
+   </xsl:template>
+   
+   <!--
+      * Licensed to the Apache Software Foundation (ASF) under one
+      * or more contributor license agreements. See the NOTICE file
+      * distributed with this work for additional information
+      * regarding copyright ownership. The ASF licenses this file
+      * to you under the Apache License, Version 2.0 (the  "License");
+      * you may not use this file except in compliance with the License.
+      * You may obtain a copy of the License at
+      *
+      *     http://www.apache.org/licenses/LICENSE-2.0
+      *
+      * Unless required by applicable law or agreed to in writing, software
+      * distributed under the License is distributed on an "AS IS" BASIS,
+      * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+      * See the License for the specific language governing permissions and
+      * limitations under the License.
+   -->
+
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/tests/xsl_iterate/test1_e.xml b/tests/xsl_iterate/test1_e.xml
new file mode 100644
index 00000000..c4fc37e9
--- /dev/null
+++ b/tests/xsl_iterate/test1_e.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<elem>
+   <item weight="5">A</item>
+   <item weight="6">B</item>
+   <item weight="7">C</item>
+   <item weight="8">D</item>
+   <item weight="9">E</item>
+   <item weight="10">F</item>
+   <item weight="11">G</item>
+   <item weight="12">H</item>
+   <item weight="13">I</item>
+   <item weight="14">J</item>
+</elem>
\ No newline at end of file


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