web-dev-qa-db-fra.com

XPath - Sélection d'éléments d'une valeur égale

Dans Xpath, je souhaite sélectionner des éléments d’une valeur spécifique.

Exemple de données XML:

<aaa id="11" >
    <aaa id="21" >
        <aaa id="31" ></aaa>
        <bbb id="32" >
            <aaa id="41" ></aaa>
            <bbb id="42" ></bbb>
            <ccc id="43" ></ccc>
            <ddd id="44" >qwerty</ddd>
            <ddd id="45" ></ddd>
            <ddd id="46" ></ddd>
        </bbb>
    </aaa>
    <bbb id="22" >
         <aaa id="33" >qwerty</aaa>
         <bbb id="34" ></bbb>
         <ccc id="35" ></ccc>
         <ddd id="36" ></ddd>
         <ddd id="37" ></ddd>
         <ddd id="38" ></ddd>
    </bbb>
    <ccc id="23" >qwerty</ccc>
    <ccc id="24" ></ccc>
 </aaa>

Maintenant, en utilisant le XPath:

//ccc[.='qwerty']

Je reçois les résultats corrects attendus :

Name    Value
ccc     qwerty

Maintenant, en utilisant le XPath:

//aaa[.='qwerty']

J'obtiens des résultats inattendus :

Name    Value
aaa      
aaa     qwerty

Et ce qui m'intéresse particulièrement, c'est comment sélectionner un élément quelconque avec cette valeur

XPath:

//*[.='qwerty']

Je reçois des résultats très étranges inattendus :

Name    Value
aaa
bbb
ddd     qwerty
bbb     qwerty
aaa     qwerty
ccc     qwerty

Quelqu'un peut-il expliquer ces résultats et comment corriger les expressions XPath afin d'obtenir davantage de résultats attendus?

94
developer

La spécification XPath définit la valeur de la chaîne d'un élément comme la concaténation (dans l'ordre du document) de tous ses descendants de nœuds de texte.

Ceci explique les "résultats étranges".

Les "meilleurs" résultats peuvent être obtenus en utilisant les expressions ci-dessous:

//*[text() = 'qwerty']

Ce qui précède sélectionne chaque élément du document ayant au moins un enfant de noeud de texte avec la valeur 'qwerty'.

//*[text() = 'qwerty' and not(text()[2])]

Ce qui précède sélectionne tous les éléments du document qui n’ont qu’un seul enfant de noeud de texte et dont la valeur est: 'qwerty'.

153
Dimitre Novatchev

Essayer

//*[text()='qwerty'] parce que . est votre élément actuel

15
Gregoire