2016-07-20 9 views
2

an der DTD der Suche:XPath-Context-Knoten während Achse Navigation

<!ELEMENT root (a|b)+> 
<!ELEMENT a (a|b)*> 
<!ELEMENT b (a|b)*> 

Und die folgenden einfachen XML: (I die Elemente der Einfachheit halber getaggt)

<root> 
    <b1> 
    <b2></b2> 
    <a1></a1> 
    </b1> 
    <b3></b3> 
</root> 

Wenn ich die folgenden Abfragen:

a) /descendant-or-self::node()/b[1] 
b) /descendant-or-self::b[1] 

Sowohl in a) und b), bevor ich [1] anwende, bekomme ich alle b's im XML-Baum.
Aber wenn ich nach dem ersten b frage, bekomme ich in a) {b1, b2} und in b) bekomme ich nur {b1}.
Meine Frage ist, was ist die Logik über Kontextknoten in diesem Szenario? Mit anderen Worten, warum ist der Unterschied zwischen "/ abcendant-or-self :: node()/b" (was ich weiß, äquivalent zu "//") und "/ abcendant-or-self/b"?

Antwort

1

/descendant-or-self::node()/b[1] wählt alle b Elemente, die die erste ([1]) b Kind ihres Mutterelement als /descendant-or-self::node()/b[1] für /descendant-or-self::node()/child::b[1] kurz ist. /descendant-or-self::b wählt alle b Elemente im Dokument und mit /descendant-or-self::b[1] wählen Sie die erste von ihnen.

+0

Im Allgemeinen gibt/descendant-or-self :: b alle b zurück, wobei der Kontextknoten das "self" ist, von dem aus ich zu "demcendant-or-self" navigiere? Wenn ja, so "/ abcendant-or-self :: b [2]" Ich bekomme das zweitnächste Tag für root in der xml-Datei, b2 in meinem Beispiel? – sel