105 votes

Comment sélectionner un nœud en utilisant XPath si le nœud frère a une valeur spécifique ?

J'ai le document suivant :

<a>
  <bb>abc</bb>
  <cc>ccc</cc>
  <dd>ddd</dd>
</a>
<a>
  <bb>zz</bb>
  <cc>1</cc>
  <dd>2</dd>
</a>

Comment puis-je obtenir la valeur de <cc> en utilisant XPath si <bb> es zz ?

117voto

Jens Erat Points 12190

Je ne sais pas pourquoi tout le monde demande des frères et sœurs, vous pouvez aussi vérifier les éléments suivants <bb/> -éléments correspondant au prédicat de <a/> Le prédicat de l'entreprise :

//a[bb/text() = "zz"]/cc/text()

46voto

Stanley Points 1952

Ce dont vous avez besoin, c'est following-sibling Axe XPath

//a/bb[text()="zz"]/following-sibling::cc[1]/text()

Testez le Xpath ici : http://www.xpathtester.com/obj/b55ec3ac-dfa4-4f44-81e8-f963ea4a0625

30voto

hr_117 Points 5603

Q : Comment sélectionner un nœud en utilisant XPath si le nœud frère a une valeur spécifique ?
Comme il n'existe que des "axes XPath" pour les frères et sœurs suivants et les frères et sœurs précédents, vous pouvez utiliser l'un d'entre eux si la position est fixe.

Mais mieux : Cherchez cc où le parent a un enfant bb avec valeur 'zz' :

//cc[../bb='zz']

10voto

Slanec Points 14354

Tout d'abord, votre exemple n'est pas un XML bien formé. Sans tenir compte de cela et du fait que vous n'avez pas très bien décrit vos intentions (que voulez-vous exactement sélectionner et à quelle condition ?), je suppose que vous voulez faire ceci :

//cc[preceding-sibling::bb[text()="zz"]]/text()

Il sélectionne

TEXT VALUES OF ALL <CC> ELEMENTS
//cc                                    /text()
    THAT HAVE A PRECEDING SIBLING <BB>
    [preceding-sibling::bb             ]
                          THAT HAS TEXT VALUE EQUAL TO "zz"
                          [text()="zz"]

Vous pouvez aussi l'écrire comme

//bb[text()="zz"]/following-sibling::cc/text()

Veuillez consulter la spécification il contient des textes très lisibles exemples dont vous apprendrez beaucoup.

7voto

Saleh Mahmood Points 503

Une autre solution pour ce problème est

//bb[contains(.,'zz')]/../cc/text()

Explication : Tout bb qui contient 'zz' dans tous les noeuds enfants de bb puis aller au noeud parent de ce bb en utilisant .. maintenant que nous pouvons accéder au cc donc retour du texte.

J'espère que cette explication n'est pas complexe.

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