fixed bug #104817 with delegateURI fixing bugs #104123 and #104125 Daniel
* catalog.c: fixed bug #104817 with delegateURI
* xpath.c: fixing bugs #104123 and #104125
Daniel
diff --git a/xpath.c b/xpath.c
index 86163f1..4bbb7dd 100644
--- a/xpath.c
+++ b/xpath.c
@@ -53,6 +53,10 @@
#include <libxml/threads.h>
#include <libxml/globals.h>
+/*
+ * TODO: when compatibility allows remove all "fake node libxslt" strings
+ * the test should just be name[0] = ' '
+ */
/* #define DEBUG */
/* #define DEBUG_STEP */
/* #define DEBUG_STEP_NTH */
@@ -1676,6 +1680,9 @@
if (val == NULL) return;
+ if ((val->type == XML_ELEMENT_NODE) && (val->name[0] == ' '))
+ return; /* an XSLT fake node */
+
/* @@ with_ns to check wether namespace nodes should be looked at @@ */
/*
* check against doublons
@@ -1731,6 +1738,9 @@
xmlXPathNodeSetAddUnique(xmlNodeSetPtr cur, xmlNodePtr val) {
if (val == NULL) return;
+ if ((val->type == XML_ELEMENT_NODE) && (val->name[0] == ' '))
+ return; /* an XSLT fake node */
+
/* @@ with_ns to check wether namespace nodes should be looked at @@ */
/*
* grow the nodeTab if needed
@@ -5269,8 +5279,9 @@
if (ctxt->context->node->parent == NULL)
return((xmlNodePtr) ctxt->context->doc);
if ((ctxt->context->node->parent->type == XML_ELEMENT_NODE) &&
- (xmlStrEqual(ctxt->context->node->parent->name,
- BAD_CAST "fake node libxslt")))
+ ((ctxt->context->node->parent->name[0] == ' ') ||
+ (xmlStrEqual(ctxt->context->node->parent->name,
+ BAD_CAST "fake node libxslt"))))
return(NULL);
return(ctxt->context->node->parent);
case XML_ATTRIBUTE_NODE: {
@@ -5340,8 +5351,9 @@
if (ctxt->context->node->parent == NULL)
return((xmlNodePtr) ctxt->context->doc);
if ((ctxt->context->node->parent->type == XML_ELEMENT_NODE) &&
- (xmlStrEqual(ctxt->context->node->parent->name,
- BAD_CAST "fake node libxslt")))
+ ((ctxt->context->node->parent->name[0] == ' ') ||
+ (xmlStrEqual(ctxt->context->node->parent->name,
+ BAD_CAST "fake node libxslt"))))
return(NULL);
return(ctxt->context->node->parent);
case XML_ATTRIBUTE_NODE: {
@@ -5391,7 +5403,9 @@
if (cur->parent == NULL)
return(NULL);
if ((cur->parent->type == XML_ELEMENT_NODE) &&
- (xmlStrEqual(cur->parent->name, BAD_CAST "fake node libxslt")))
+ ((cur->parent->name[0] == ' ') ||
+ (xmlStrEqual(cur->parent->name,
+ BAD_CAST "fake node libxslt"))))
return(NULL);
return(cur->parent);
case XML_ATTRIBUTE_NODE: {
@@ -5959,7 +5973,10 @@
case XML_ELEMENT_NODE:
case XML_ATTRIBUTE_NODE:
case XML_PI_NODE:
- valuePush(ctxt,
+ if (cur->nodesetval->nodeTab[i]->name[0] == ' ')
+ valuePush(ctxt, xmlXPathNewCString(""));
+ else
+ valuePush(ctxt,
xmlXPathNewString(cur->nodesetval->nodeTab[i]->name));
break;
case XML_NAMESPACE_DECL:
@@ -6069,13 +6086,15 @@
switch (cur->nodesetval->nodeTab[i]->type) {
case XML_ELEMENT_NODE:
case XML_ATTRIBUTE_NODE:
- if ((cur->nodesetval->nodeTab[i]->ns == NULL) ||
- (cur->nodesetval->nodeTab[i]->ns->prefix == NULL))
+ if (cur->nodesetval->nodeTab[i]->name[0] == ' ')
+ valuePush(ctxt, xmlXPathNewCString(""));
+ else if ((cur->nodesetval->nodeTab[i]->ns == NULL) ||
+ (cur->nodesetval->nodeTab[i]->ns->prefix == NULL)) {
valuePush(ctxt,
xmlXPathNewString(cur->nodesetval->
nodeTab[i]->name));
- else {
+ } else {
char name[2000];
snprintf(name, sizeof(name), "%s:%s",