web-dev-qa-db-fra.com

Comment sélectionner un nœud à l'aide de 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> _ est zz?

69
HOE SENGKIANG

Vous ne savez pas pourquoi tout le monde interroge un frère ou une soeur, vous pouvez également rechercher des éléments <bb/> Correspondant au prédicat du prédicat de <a/>:

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

Vous avez besoin de 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

27
Stanley

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

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

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

Tout d’abord, votre exemple n’est pas un XML bien formé. En négligeant cela et en ne décrivant pas très bien vos intentions (que voulez-vous exactement sélectionner à 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 pourriez écrire est aussi comme

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

S'il vous plaît regardez la spécification , il a quelques très bien lisible exemples à partir de laquelle vous apprendrez beaucoup.

4
Petr Janeček
//a/cc[../bb='zz']/text()

// a: Sélectionne tous les éléments 'a' peu importe où ils se trouvent.

// a/cc: Sélectionne les éléments 'cc' qui sont les enfants de l'élément 'a' (peu importe où a est).

..: Sélectionne le parent du nœud actuel.

[../bb='zz ']: où la valeur de l'élément' bb 'frère est zz.

Référence: http://www.w3schools.com/xsl/xpath_syntax.asp

3
Bae Cheol Shin

Une autre solution à ce problème est

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

Explication: N'importe quel bb qui contient 'zz' chaîne dans tous les nœuds enfants de bb, puis passage au nœud parent de cette bb à l'aide de .., maintenant que nous pouvons accéder au cc ainsi retourner le texte.

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

2
Saleh Mahmood