Jaka jest różnica między „/ node ()” a „node ()” w XPath?

Aug 18 2020

Zgodnie z moim rozumieniem XPath, dla dowolnego dokumentu HTML lub XML:
$x("/node()")oznacza $x("/child::node()")to, że zwróć węzeł, który jest dzieckiem węzła kontekstu. Tutaj węzeł główny (/)jest węzłem kontekstu. Dlatego zwraca htmlelement.

$x("node()")oznacza, $x("child::node()")który również zwraca ten sam htmlelement. Ale w tym przypadku nie dostarczyliśmy węzła kontekstu, inaczej niż w powyższym przypadku. Jak więc w tym przypadku identyfikuje węzeł kontekstu?

Ponadto oba powyższe wyrażenia XPath są składniowo i funkcjonalnie takie same.

Odpowiedzi

1 kjhughes Aug 18 2020 at 22:16

Różnica polega na tym, /node()że absolutnie określa węzeł kontekstu jako dokument root ( /), ale node()opiera się na domniemanym, względnym węźle kontekstu.

W jaki sposób określany jest domniemany, względny węzeł kontekstu? Cóż, na podstawie kontekstu. ;-) Na przykład język hostujący zwykle ustawia początkowy węzeł kontekstu na bieżący węzeł dopasowywany lub iterowany. Następnie, w ramach oceny samego XPath, każdy krok lokalizacji (oddzielony ukośnikami /) ustanawia węzeł kontekstu dla kolejnych kroków.

$x(path, [startNode])Notacja używana w konsoli Chrome zajmuje opcjonalny drugi argument, który może być wykorzystany do określenia węzeł kontekstu wyraźnie. Domyślnie jest równy węzłowi głównemu dokumentu, co prowadzi do zaobserwowanego zachowania, gdzie $x("node()")i $x("/node()")zwraca te same wyniki dla danego dokumentu.

Ponadto oba powyższe wyrażenia XPath są składniowo i funkcjonalnie takie same.

Wyraźnie node()i child::node()różnią się składnią , ale tak, semantycznie (lub funkcjonalnie , jak mówisz) są takie same, ponieważ child::oś jest osią domyślną.

Zobacz też

  • Bieżący węzeł a węzeł kontekstowy w XSLT / XPath?
  • Jaka jest różnica między węzłem głównym, elementem głównym i elementem dokumentu w XML?
  • Jaka jest różnica między .// i // * w XPath?