Was ist der Unterschied zwischen "/ node ()" und "node ()" in XPath?
Nach meinem Verständnis von XPath bedeutet für jedes HTML- oder XML-Dokument:
$x("/node()")Dies $x("/child::node()")bedeutet, dass der Knoten zurückgegeben wird, der dem Kontextknoten untergeordnet ist. Hier ist der Wurzelknoten (/)der Kontextknoten. Daher wird das htmlElement zurückgegeben.
$x("node()")bedeutet, $x("child::node()")dass auch das gleiche htmlElement zurückgibt . In diesem Fall haben wir den Kontextknoten jedoch nicht anders als im obigen Fall bereitgestellt. Wie identifiziert es in diesem Fall den Kontextknoten?
Außerdem sind beide oben genannten XPath-Ausdrücke syntaktisch und funktional gleich.
Antworten
Der Unterschied besteht darin, dass /node()der Kontextknoten absolut als Dokumentstamm ( /) angegeben wird, jedoch node()ein impliziter, relativer Kontextknoten verwendet wird.
Wie wird ein impliziter relativer Kontextknoten bestimmt? Nun, basierend auf dem Kontext. ;-) Beispielsweise setzt die Hosting-Sprache normalerweise den anfänglichen Kontextknoten auf den aktuellen Knoten, der abgeglichen oder iteriert wird. Innerhalb der Auswertung des XPath selbst selbst erstellt jeder Standortschritt (durch Schrägstriche getrennt /) den Kontextknoten für die nachfolgenden Schritte.
Die $x(path, [startNode])in der Chrome-Konsole verwendete Notation verwendet ein optionales zweites Argument, mit dem der Kontextknoten explizit angegeben werden kann. Standardmäßig ist sie gleich den Dokument Wurzelknoten, was zu dem beobachteten Verhalten , wo $x("node()")und $x("/node()")die gleichen Ergebnisse für ein bestimmtes Dokument zurückgegeben.
Außerdem sind beide oben genannten XPath-Ausdrücke syntaktisch und funktional gleich.
Klar node()und child::node()sind syntaktisch anders, aber, ja, sie sind semantisch (oder funktionell , wie Sie sagen) gleich , da die child::Achse der Standardachse ist.
Siehe auch
- Aktueller Knoten vs. Kontextknoten in XSLT / XPath?
- Was ist der Unterschied zwischen Stammknoten, Stammelement und Dokumentelement in XML?
- Was ist der Unterschied zwischen .// und // * in XPath?