Quelle est la différence entre «/ node ()» et «node ()» dans XPath?
Selon ma compréhension de XPath, pour tout document HTML ou XML:
$x("/node()")
signifie $x("/child::node()")
ce qui signifie retourner le nœud qui est un enfant du nœud de contexte. Ici, le nœud racine (/)
est le nœud de contexte. Par conséquent, il renvoie l' html
élément.
$x("node()")
signifie $x("child::node()")
qui renvoie également le même html
élément. Mais dans ce cas, nous n'avons pas fourni le nœud de contexte contrairement au cas ci-dessus. Alors, comment identifie-t-il le nœud de contexte dans ce cas?
En outre, les expressions XPath ci-dessus sont-elles syntaxiquement et fonctionnellement identiques.
Réponses
La différence est que /node()
spécifie le nœud de contexte absolument comme racine du document ( /
), mais node()
repose sur un nœud de contexte relatif implicite.
Comment un nœud de contexte relatif implicite est-il déterminé? Eh bien, basé sur le contexte. ;-) Par exemple, le langage d'hébergement définira généralement le nœud de contexte initial sur le nœud actuel en cours de correspondance ou d'itération. Ensuite, dans l'évaluation du XPath lui-même, chaque étape de localisation (séparée par des barres obliques /
) établit le nœud de contexte pour les étapes suivantes.
La $x(path, [startNode])notation utilisée dans la console Chrome prend un deuxième argument facultatif qui peut être utilisé pour spécifier explicitement le nœud de contexte. Par défaut, il est égal au nœud racine du document, ce qui conduit au comportement observé où $x("node()")
et a $x("/node()")
renvoyé les mêmes résultats pour un document donné.
En outre, les expressions XPath ci-dessus sont-elles syntaxiquement et fonctionnellement identiques.
Clairement node()
et child::node()
sont syntaxiquement différents, mais, oui, ils sont sémantiquement (ou fonctionnellement , comme vous dites) les mêmes parce que l' child::
axe est l'axe par défaut.
Voir également
- Nœud actuel vs nœud de contexte dans XSLT / XPath?
- Quelle est la différence entre le nœud racine, l'élément racine et l'élément document en XML?
- Quelle est la différence entre .// et // * dans XPath?