[libxml2] Allow attributes on descendant-or-self axis
- From: Nick Wellnhofer <nwellnhof src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libxml2] Allow attributes on descendant-or-self axis
- Date: Sun, 8 Mar 2015 16:14:56 +0000 (UTC)
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]