web-dev-qa-db-fra.com

XPath trouve tous les éléments avec un noeud enfant spécifique

Pourriez-vous m'aider à trouver tous les éléments b ayant l'élément enfant c dans l'exemple ci-dessous?

<a>
    <b name = "b1"></b>
    <b name = "b2"><c/></b>
    <b name = "b3"></b>
</a>

La requête xpath doit renvoyer l'élément b2

La deuxième question est je veux combiner 2 conditions: je veux obtenir l’élément qui a name = "b2" et a l’élément c Mais cette syntaxe ne semble pas fonctionner: // b [@ name = 'b2' et c]

44
nam

Lorsque la structure du document XML est connue, il est préférable d'éviter d'utiliser le fichier // Pseudo-opérateur XPath, car son utilisation peut entraîner une grande inefficacité (traversée de l’arbre de document entier).

Par conséquent, je recommande cette expression XPath pour le document XML fourni:

/*/b[c]

Ceci sélectionne n'importe quel élément b qui est un enfant de l'élément supérieur du document XML et qui a un élément enfant nommé c.

UPDATE : Le PO a posé une deuxième question il y a quelques minutes à peine:

La deuxième question est je veux combiner 2 conditions: je veux obtenir l’élément qui a name = "b2" et a l’élément c Mais cette syntaxe ne semble pas fonctionner: //b[@name='b2' and c]

L’expression XPath fournie fait sélectionne exactement l’élément recherché.

Voici la vérification basée sur XSLT:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
     <xsl:copy-of select="//b[@name='b2' and c]"/>
 </xsl:template>
</xsl:stylesheet>

Lorsque cette transformation est appliquée sur le document XML fourni:

<a>
    <b name = "b1"></b>
    <b name = "b2"><c/></b>
    <b name = "b3"></b>
</a>

l'expression XPath est évaluée et l'élément correctement sélectionné est copié dans la sortie:

<b name="b2">
   <c/>
</b>
53

Il devrait être aussi simple que

//b[c]

c'est-à-dire trouver un b n'importe où ayant un enfant c.

21
choroba