diff --git a/ChangeLog b/ChangeLog
index 2aa9e64fe9e2a88c656b38d069419292e0b77c73_Q2hhbmdlTG9n..a9b03c3c2cb01a580a2f5ce0fdff38f09aa23d7a_Q2hhbmdlTG9n 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri Sep 24 09:17:22 PDT 2004 William Brack <wbrack@mmm.com.hk>
+
+	* libexslt/date.c: fixed problem with empty sets, etc.
+	  (see discussion on mailing list)
+
 Sat Sep 18 17:08:31 PDT 2004 William Brack <wbrack@mmm.com.hk>
 
 	* libexslt/date.c: fixed problem with timezone offset
diff --git a/libexslt/date.c b/libexslt/date.c
index 2aa9e64fe9e2a88c656b38d069419292e0b77c73_bGliZXhzbHQvZGF0ZS5j..a9b03c3c2cb01a580a2f5ce0fdff38f09aa23d7a_bGliZXhzbHQvZGF0ZS5j 100644
--- a/libexslt/date.c
+++ b/libexslt/date.c
@@ -2748,5 +2748,6 @@
     if (xmlXPathCheckError (ctxt))
 	return;
 
-    if ((ns == NULL) || (ns->nodeNr == 0))
+    if ((ns == NULL) || (ns->nodeNr == 0)) {
+	xmlXPathReturnEmptyString (ctxt);
 	return;
@@ -2752,3 +2753,4 @@
 	return;
+    }
 
     total = exsltDateCreateDate (XS_DURATION);
@@ -2753,6 +2755,8 @@
 
     total = exsltDateCreateDate (XS_DURATION);
+    if (total == NULL)
+        return;
 
     for (i = 0; i < ns->nodeNr; i++) {
 
 	tmp = xmlXPathCastNodeToString (ns->nodeTab[i]);
@@ -2755,6 +2759,7 @@
 
     for (i = 0; i < ns->nodeNr; i++) {
 
 	tmp = xmlXPathCastNodeToString (ns->nodeTab[i]);
-	if (tmp == NULL)
+	if (tmp == NULL) {
+	    exsltDateFreeDate (total);
 	    return;
@@ -2760,5 +2765,6 @@
 	    return;
+	}
 
 	x = exsltDateParseDuration (tmp);
 	if (x == NULL) {
 	    xmlFree (tmp);
@@ -2761,7 +2767,9 @@
 
 	x = exsltDateParseDuration (tmp);
 	if (x == NULL) {
 	    xmlFree (tmp);
+	    exsltDateFreeDate (total);
+	    xmlXPathReturnEmptyString (ctxt);
 	    return;
 	}