[libxml2] Allow attributes on descendant-or-self axis



commit f6aaabce85baf48d622cb4686df810fdba3db073
Author: Nick Wellnhofer <wellnhofer aevum de>
Date:   Sun Mar 8 16:05:26 2015 +0100

    Allow attributes on descendant-or-self axis
    
    If the context node is an attribute, the attribute itself is on the
    descendant-or-self axis. The principal node type of this axis is element,
    so the only node test that can return the attribute is "node()". In other
    words, "@attr/descendant-or-self::node()" is equivalent to "@attr".
    
    This matches the behavior of Saxon-CE.

 result/XPath/tests/simplebase |    8 ++++++++
 test/XPath/tests/simplebase   |    1 +
 xpath.c                       |   14 +++++++-------
 3 files changed, 16 insertions(+), 7 deletions(-)
---
diff --git a/result/XPath/tests/simplebase b/result/XPath/tests/simplebase
index 38fa144..980d18e 100644
--- a/result/XPath/tests/simplebase
+++ b/result/XPath/tests/simplebase
@@ -60,6 +60,14 @@ Set contains 3 nodes:
     content=   
 
 ========================
+Expression: /child::EXAMPLE/attribute::prop1/descendant-or-self::node()
+Object is a Node Set :
+Set contains 1 nodes:
+1  ATTRIBUTE prop1
+    TEXT
+      content=gnome is great
+
+========================
 Expression: /descendant::title
 Object is a Node Set :
 Set contains 2 nodes:
diff --git a/test/XPath/tests/simplebase b/test/XPath/tests/simplebase
index 7e4203a..9a1476e 100644
--- a/test/XPath/tests/simplebase
+++ b/test/XPath/tests/simplebase
@@ -5,5 +5,6 @@
 /child::EXAMPLE/child::head/child::title
 /child::EXAMPLE/child::head/child::title/child::text()
 /child::EXAMPLE/child::head/node()
+/child::EXAMPLE/attribute::prop1/descendant-or-self::node()
 /descendant::title
 /descendant::p/ancestor::chapter
diff --git a/xpath.c b/xpath.c
index dc41ce6..ffd2a48 100644
--- a/xpath.c
+++ b/xpath.c
@@ -7933,14 +7933,14 @@ xmlXPathNextDescendant(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
 xmlNodePtr
 xmlXPathNextDescendantOrSelf(xmlXPathParserContextPtr ctxt, xmlNodePtr cur) {
     if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
-    if (cur == NULL) {
-       if (ctxt->context->node == NULL)
-           return(NULL);
-       if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) ||
-           (ctxt->context->node->type == XML_NAMESPACE_DECL))
-           return(NULL);
+    if (cur == NULL)
         return(ctxt->context->node);
-    }
+
+    if (ctxt->context->node == NULL)
+        return(NULL);
+    if ((ctxt->context->node->type == XML_ATTRIBUTE_NODE) ||
+        (ctxt->context->node->type == XML_NAMESPACE_DECL))
+        return(NULL);
 
     return(xmlXPathNextDescendant(ctxt, cur));
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]