3 votes

XPath : Pourquoi /document-node() correspond-il au nœud du document ?

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() .

2voto

Mads Hansen Points 24537

Il semble que ce soit un bogue dans XML Spy.

3.3.5 Syntaxe abrégée

  1. Si le nom de l'axe est omis dans un pas d'axe, l'axe par défaut est le suivant child à deux exceptions près : si le NodeTest d'une étape d'axe contient un AttributeTest ou un SchemaAttributeTest, l'axe par défaut est le suivant attribute si le NodeTest d'une étape d'axe est un NamespaceNodeTest, une erreur statique est générée [err:XQST0134] .

Lors de la vérification avec Saxon 9.8.0.8 (HE, PE, EE) et MarkLogic 9.0.3, le XPath /document-node() y /child::document-node() ne sélectionnez rien.

Ces XPaths avec des noms d'axes différents sélectionnent bien les document-node() :

/self::document-node()
/ancestor-or-self::document-node()
/*/ancestor::document-node()
/*/ancestor-or-self::document-node()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X