diff --git a/ChangeLog b/ChangeLog
index 01afd65..0f74718 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Thu Feb 22 07:52:27 CET 2001 Daniel Veillard <Daniel.Veillard@imag.fr>
+
+	* xpath.c: finally implemented xmlXPathCompareNodeSets
+	* test/XPath/expr/floats results/XPath/expr/floats: added 
+	  a test for float expressions
+
 Tue Feb 20 18:57:54 CET 2001 Daniel Veillard <Daniel.Veillard@imag.fr>
 
 	* tree.c: fixed xmlNodeGetContent, it was not recursing on child
diff --git a/result/XPath/expr/floats b/result/XPath/expr/floats
new file mode 100644
index 0000000..2aa7897
--- /dev/null
+++ b/result/XPath/expr/floats
@@ -0,0 +1,52 @@
+
+========================
+Expression: 1
+Object is a number : 1
+
+========================
+Expression: 123
+Object is a number : 123
+
+========================
+Expression: 1.23
+Object is a number : 1.23
+
+========================
+Expression: 0.123
+Object is a number : 0.123
+
+========================
+Expression: 1 div 0
+Object is a number : inf
+
+========================
+Expression: -1 div 0
+Object is a number : -inf
+
+========================
+Expression: 0 div 0
+Object is a number : nan
+
+========================
+Expression: (1 div 0) > 0
+Object is a Boolean : true
+
+========================
+Expression: (1 div 0) < 0
+Object is a Boolean : false
+
+========================
+Expression: (-1 div 0) > 0
+Object is a Boolean : false
+
+========================
+Expression: (-1 div 0) < 0
+Object is a Boolean : true
+
+========================
+Expression: (0 div 0) > 0
+Object is a Boolean : false
+
+========================
+Expression: (0 div 0) < 0
+Object is a Boolean : false
diff --git a/test/XPath/expr/floats b/test/XPath/expr/floats
new file mode 100644
index 0000000..a1e5612
--- /dev/null
+++ b/test/XPath/expr/floats
@@ -0,0 +1,13 @@
+1
+123
+1.23
+0.123
+1 div 0
+-1 div 0
+0 div 0
+(1 div 0) > 0
+(1 div 0) < 0
+(-1 div 0) > 0
+(-1 div 0) < 0
+(0 div 0) > 0
+(0 div 0) < 0
diff --git a/xpath.c b/xpath.c
index 22a2dab..669e4cd 100644
--- a/xpath.c
+++ b/xpath.c
@@ -1863,8 +1863,8 @@
  * @ctxt:  the XPath Parser context
  * @op:  less than (-1), equal (0) or greater than (1)
  * @strict:  is the comparison strict
- * @ns1:  the fist node set
- * @ns2:  the second node set
+ * @arg1:  the fist node set object
+ * @arg2:  the second node set object
  *
  * Implement the compare operation on nodesets:
  *
@@ -1889,8 +1889,71 @@
  */
 int
 xmlXPathCompareNodeSets(xmlXPathParserContextPtr ctxt, int inf, int strict,
-	                xmlXPathObjectPtr ns1, xmlXPathObjectPtr ns2) {
-    TODO /* xmlXPathCompareNodeSets */
+	                xmlXPathObjectPtr arg1, xmlXPathObjectPtr arg2) {
+    int i, j, init = 0;
+    double val1;
+    double *values2;
+    int ret = 0;
+    xmlChar *str;
+    xmlNodeSetPtr ns1;
+    xmlNodeSetPtr ns2;
+
+    if ((arg1 == NULL) ||
+	((arg1->type != XPATH_NODESET) && (arg1->type != XPATH_XSLT_TREE)))
+        return(0);
+    if ((arg2 == NULL) ||
+	((arg2->type != XPATH_NODESET) && (arg2->type != XPATH_XSLT_TREE)))
+        return(0);
+
+    ns1 = arg1->nodesetval;
+    ns2 = arg2->nodesetval;
+
+    if (ns1->nodeNr <= 0)
+	return(0);
+    if (ns2->nodeNr <= 0)
+	return(0);
+
+    values2 = (double *) xmlMalloc(ns2->nodeNr * sizeof(double));
+    if (values2 == NULL) {
+	return(0);
+    }
+    for (i = 0;i < ns1->nodeNr;i++) {
+	str = xmlNodeGetContent(ns1->nodeTab[i]);
+	if (str == NULL)
+	    continue;
+	val1 = xmlXPathStringEvalNumber(str);
+	xmlFree(str);
+	if (isnan(val1))
+	    continue;
+	for (j = 0;j < ns2->nodeNr;j++) {
+	    if (init == 0) {
+		str = xmlNodeGetContent(ns2->nodeTab[j]);
+		if (str == NULL) {
+		    values2[j] = xmlXPathNAN;
+		} else {
+		    values2[j] = xmlXPathStringEvalNumber(str);
+		    xmlFree(str);
+		}
+	    }
+	    if (isnan(values2[j]))
+		continue;
+	    if (inf && strict) 
+		ret = (val1 < values2[j]);
+	    else if (inf && !strict)
+		ret = (val1 <= values2[j]);
+	    else if (!inf && strict)
+		ret = (val1 > values2[j]);
+	    else if (!inf && !strict)
+		ret = (val1 >= values2[j]);
+	    if (ret)
+		break;
+	}
+	if (ret)
+	    break;
+	init = 1;
+    }
+    xmlFree(values2);
+    return(ret);
     return(0);
 }
 
@@ -5231,10 +5294,18 @@
 	 */
 	SKIP_BLANKS;
 	name = xmlXPathScanName(ctxt);
-	if (name != NULL) {
+	if ((name != NULL) && (xmlStrstr(name, (xmlChar *) "::") != NULL)) {
+#ifdef DEBUG_STEP
+	    xmlGenericError(xmlGenericErrorContext,
+		    "PathExpr: Axis\n");
+#endif
+	    lc = 1;
+	    xmlFree(name);
+	} else if (name != NULL) {
 	    int len =xmlStrlen(name);
 	    int blank = 0;
 
+	    
 	    while (NXT(len) != 0) {
 		if (NXT(len) == '/') {
 		    /* element name */
@@ -6265,7 +6336,7 @@
 xmlXPathObjectPtr
 xmlXPathEval(const xmlChar *str, xmlXPathContextPtr ctx) {
     xmlXPathParserContextPtr ctxt;
-    xmlXPathObjectPtr res = NULL, tmp, init = NULL;
+    xmlXPathObjectPtr res, tmp, init = NULL;
     int stack = 0;
 
     xmlXPathInit();
@@ -6284,6 +6355,10 @@
     if (ctxt->value == NULL) {
 	xmlGenericError(xmlGenericErrorContext,
 		"xmlXPathEval: evaluation failed\n");
+	res = NULL;
+    } else if (*ctxt->cur != 0) {
+	xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR);
+	res = NULL;
     } else {
 	res = valuePop(ctxt);
     }
@@ -6296,7 +6371,7 @@
 	    xmlXPathFreeObject(tmp);
         }
     } while (tmp != NULL);
-    if (stack != 0) {
+    if ((stack != 0) && (res != NULL)) {
 	xmlGenericError(xmlGenericErrorContext,
 		"xmlXPathEval: %d object left on the stack\n",
 	        stack);
@@ -6333,7 +6408,12 @@
     pctxt = xmlXPathNewParserContext(str, ctxt);
     xmlXPathEvalExpr(pctxt);
 
-    res = valuePop(pctxt);
+    if (*pctxt->cur != 0) {
+	xmlXPatherror(pctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR);
+	res = NULL;
+    } else {
+	res = valuePop(pctxt);
+    }
     do {
         tmp = valuePop(pctxt);
 	if (tmp != NULL) {
@@ -6341,7 +6421,7 @@
 	    stack++;
 	}
     } while (tmp != NULL);
-    if (stack != 0) {
+    if ((stack != 0) && (res != NULL)) {
 	xmlGenericError(xmlGenericErrorContext,
 		"xmlXPathEvalExpression: %d object left on the stack\n",
 	        stack);
