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]
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>
Il devrait être aussi simple que
//b[c]
c'est-à-dire trouver un b
n'importe où ayant un enfant c
.