From f6aaabce85baf48d622cb4686df810fdba3db073 Mon Sep 17 00:00:00 2001 From: Nick Wellnhofer Date: Sun, 8 Mar 2015 16:05:26 +0100 Subject: [PATCH] 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 38fa1449..980d18ef 100644 --- a/result/XPath/tests/simplebase +++ b/result/XPath/tests/simplebase @@ -59,6 +59,14 @@ Set contains 3 nodes: 3 TEXT 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 : diff --git a/test/XPath/tests/simplebase b/test/XPath/tests/simplebase index 7e4203af..9a1476e6 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 dc41ce6b..ffd2a489 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)); }