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

144

Comment puis-je faire avec XPath:

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

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

ps J'ai vu beaucoup d'exemples mais principalement avec des attributs ou une structure à un seul nœud.

user569008
la source
5
OR inclut les deux côtés. Ce que vous recherchez, c'est l'opérateur XOR. Vous confondez l'utilisation anglaise du mot OR avec des opérateurs logiques.
Zoran Pavlovic
10
Dans ce cas, le fait d'utiliser ou ou xor ne fait aucune différence car il n'est pas possible de faire correspondre les deux côtés.
Dan Hulme

Réponses:

219

Tous les titlenœuds avec zipcodeou booknœud comme parent:

Version 1:

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

Version 2:

//bookstore/book/title|//bookstore/city/zipcode/title
Stéphan
la source
5
"|" 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. "// livre | // cd" signifie parmi tous les nœuds enfants et les descendants du nœud racine trouver tous ceux nommés 'livre' puis trouver également tous ceux nommés 'cd'. Si dans la descendance du nœud racine il n'y a que des nœuds livre, votre ensemble de nœuds contiendra uniquement des nœuds livre. Si dans la descendance du nœud racine il n'y a que des nœuds cd, votre ensemble de nœuds contiendra uniquement des nœuds cd. Si dans la descendance du nœud racine il y a à la fois des nœuds book et cd, votre ensemble de nœuds contiendra à la fois des nœuds book et cd.
Stephan
1
Oui, j'ai compris ce que "|" l'opérateur est. Ma première question concerne l'opérateur OR. Donc, s'il y a des livres et des CD, il ne trouvera que des livres, s'il n'y a pas de livres, mais uniquement des CD, il trouvera des CD.
user569008
19
@ user569008: |est l' opérateur de l'ensemble d'unions .
1
Donc, il n'y a pas de réponse à ma question / pas d'opérateur OR dans XPath pour les nœuds?
user569008
3
Les opérateurs logiques (OR, XOR, AND) sont les mêmes dans tous les langages de programmation, mais le langage naturel les interprète légèrement différemment. Il est préférable d'éliminer toute ambiguïté lorsque vous discutez des problèmes qui y sont liés. De plus, avec XPath, il est préférable de ne pas penser à votre résultat comme étant a ou b , mais plutôt qu'il pourrait être localisé par a ou b . Logique orsignifie qu'il pourrait être localisé par a or b or both. Logique xor(OU exclusif) signifie qu'il pourrait être localisé par either a or b, but not both. Logique andsignifie qu'il pourrait être localisé par both a and b.
neXus
52

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

azurkin
la source
vraiment le (et )[1]signifie de sélectionner un seul des deux?!?!
oldboy
@Anthony Oui, il sélectionnera l'un des deux, si les deux nœuds existent, ou il sélectionnera le seul qui existe.
azurkin
d'accord, 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 true, alors la seconde est contournée, ouais?
oldboy
@Anthony Non. Il n'y a pas de conditions ici. Il y a des nœuds. Et "|" - est un opérateur d'union de nœuds. Il crée un ensemble de nœuds à partir de chemins spécifiés et ne garantit pas l'ordre des nœuds. Si le nœud avec le chemin spécifié n'existe pas, il est simplement absent d'un ensemble de nœuds. Ensuite, la construction "[1]" récupère le premier nœud d'un ensemble de nœuds.
azurkin du
mon point est qu'il fonctionne de manière similaire à un opérateur orou dans d'autres langues |, de sorte que si les deux nœuds existaient, il renverrait toujours le premier nœud?
oldboy
3

Il l'élément a deux xpath. Ensuite, vous pouvez écrire deux xpaths comme ci-dessous:

xpath1 | xpath2

Par exemple:

//input[@name="username"] | //input[@id="wm_login-username"]
Subrahmanya Prasad
la source