185 votes

Opérateur XPath OR pour des nœuds différents

Comment puis-je faire avec XPath :

//bookstore/book/title or //bookstore/city/zipcode/title

Juste //title ne fonctionnera pas parce que j'ai aussi //bookstore/magazine/title

p.s. J'ai vu beaucoup d'exemples ou mais principalement avec des attributs ou une structure à nœud unique.

6 votes

L'OR comprend les deux côtés. Ce que vous cherchez, c'est l'opérateur XOR. Vous confondez l'usage anglais du mot OR avec les opérateurs logiques.

12 votes

Dans ce cas, il n'y a aucune différence si vous utilisez o ou xor car il n'est pas possible de faire correspondre les deux côtés.

263voto

Stephan Points 10596

Tous title les nœuds avec zipcode ou book comme parent :

Version 1 :

//title[parent::zipcode|parent::book]

Version 2 :

//bookstore/book/title|//bookstore/city/zipcode/title

Version 3 : (les résultats sont triés sur la base des données sources plutôt que dans l'ordre livre puis code postal)

//title[../../../*[book or magazine] or ../../../../*[city/zipcode]]

o - utilisé dans true/false - un opérateur booléen dans xpath

| - un opérateur d'union dans xpath qui ajoute la requête à droite de l'opérateur au jeu de résultats de la requête de gauche.

0 votes

Je l'ai marqué comme réponse parce que ça a marché pour moi mais je viens de voir quelque chose. L'opérateur "|" n'est-il pas AND ? Donc, XPath comme (//book | //cd) retournera un ensemble de noeuds avec tous les éléments book et cd ? N'y a-t-il pas OR, mais pas AND. Dans mon cas, cela a fonctionné, car dans l'ensemble de nœuds, j'ai l'un ou l'autre, mais pas les deux, si j'ai les deux, les résultats seront doublés.

6 votes

L'opérateur "|" n'est pas vraiment un "opérateur OR" dans XPath, il vous permet de construire un ensemble de nœuds composé de sous-arbres d'un arbre XML entier. "//book|//cd" signifie que parmi tous les noeuds enfants et descendants du noeud racine, on trouve tous ceux qui sont nommés 'book', puis tous ceux qui sont nommés 'cd'. Si, dans la descendance du noeud racine, il n'y a que des noeuds "book", votre ensemble de noeuds ne contiendra que des noeuds "book". Si, dans la descendance du noeud racine, il n'y a que des noeuds cd, votre ensemble de noeuds ne contiendra que des noeuds cd. Si dans la descendance du noeud racine il y a à la fois des noeuds de livres et de CD, votre ensemble de noeuds contiendra à la fois des noeuds de livres et de CD.

1 votes

Oui, j'ai compris ce qu'est l'opérateur "|". Ma question initiale concerne l'opérateur OR. Donc, s'il y a des livres et des cds, il ne trouvera que des livres, s'il n'y a pas de livres, mais seulement des cds, il trouvera des cds.

70voto

azurkin Points 133

Si vous souhaitez sélectionner un seul des deux nœuds avec l'opérateur d'union, vous pouvez utiliser cette solution : (//bookstore/book/title | //bookstore/city/zipcode/title)[1]

0 votes

Vraiment le ( y )[1] permet de ne sélectionner qu'un seul des deux ?!?!

0 votes

@Anthony Oui, il sélectionnera l'un des deux, si les deux nœuds existent, ou il sélectionnera le seul qui existe.

0 votes

Ok, j'ai mal interprété votre déclaration. il fonctionne comme n'importe quel autre opérateur "ou", de sorte que si la première condition retourne vrai, alors la seconde est contournée, oui ?

17voto

Si l'élément a deux xpaths. Alors vous pouvez écrire deux xpaths comme ci-dessous :

xpath1 | xpath2

Eg :

//input[@name="username"] | //input[@id="wm_login-username"]

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