Jaka jest różnica między „/ node ()” a „node ()” w XPath?
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
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?