1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2025-01-13 13:17:36 +03:00

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.
This commit is contained in:
Nick Wellnhofer 2015-03-08 16:05:26 +01:00
parent 620a70615e
commit f6aaabce85
3 changed files with 16 additions and 7 deletions

View File

@ -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 :

View File

@ -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

14
xpath.c
View File

@ -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));
}