Une expression XPath de /
renvoie le nœud du document.
Une expression XPath de /html
est équivalent à /child::html
et, pour un document HTML, renvoie l'élément html. Ceci est bien sûr évalué en allant au nœud du document (indiqué par l'élément /
) et ensuite trouver l'élément enfant qui est une balise html.
Pourquoi alors /document-node()
renvoie réellement le nœud du document ?
Compte tenu des règles générales d'expression XPath, je suppose que /document-node()
est équivalent à /child::document-node()
y /child::document-node()
devrait retourner une séquence de nœuds vide (puisqu'un nœud de document n'est jamais l'enfant d'un nœud de document). En effet /child::document-node()
fait renvoie une séquence de nœuds vide, ce qui m'amène à penser que /document-node()
n'est pas équivalent à /child::document-node()
. Cela semble violer les règles générales d'expression XPath, selon lesquelles un axe vide est un axe enfant implicite. 1 .
Existe-t-il une règle spéciale telle que lorsque vous avez un pas de document-node()
l'axe est supposé être self
au lieu de child
? J'utilise la dernière version d'Altova XMLSpy (2018 sp1). Sinon, s'agit-il d'un bogue dans XMLSpy ? Ou une partie de ma compréhension des règles générales d'expression XPath est-elle incorrecte ?
Remarque : pour tous ceux qui essaient, seuls XPath 2 et XPath 3 prennent en charge document-node()
.
1 Mise à jour : pour information, la réponse de Mads Hansen m'a appris quelque chose de nouveau : dans XPath 2 et XPath 3, un axe vide est un axe enfant implicite. sauf si il y a un test d'attribut ; s'il y a un test d'attribut, c'est en fait un axe d'attribut implicite. Ainsi, pendant que /html
est implicitement /child::html
, /attribute()
est implicitement /attribute::attribute()
.