web-dev-qa-db-fra.com

Quel est le XPath correct pour choisir des attributs contenant "foo"?

Étant donné ce XML, ce que XPath renvoie tous les éléments dont l'attribut prop contient Foo (les trois premiers nœuds):

<bla>
 <a prop="Foo1"/>
 <a prop="Foo2"/>
 <a prop="3Foo"/>
 <a prop="Bar"/>
</bla>
159
ripper234
//a[contains(@prop,'Foo')]

Fonctionne si j'utilise ce XML pour obtenir des résultats.

<bla>
 <a prop="Foo1">a</a>
 <a prop="Foo2">b</a>
 <a prop="3Foo">c</a>
 <a prop="Bar">a</a>
</bla>

Edit: Une autre chose à noter est que, bien que XPath ci-dessus renvoie la réponse correcte pour ce XML particulier, si vous voulez garantir que vous n’obtenez que les éléments "a" de l’élément "bla", vous devriez, comme d’autres l'ont déjà mentionné, utiliser

/bla/a[contains(@prop,'Foo')]

Cela vous cherchera tous les éléments "a" dans votre document XML entier, indépendamment de leur imbrication dans un élément "blah"

//a[contains(@prop,'Foo')]  

J'ai ajouté ceci dans un souci de minutie et dans l'esprit du stackoverflow. :)

278
evilhomer

Ce XPath vous donnera tous les nœuds qui ont des attributs contenant "Foo" indépendamment du nom du nœud ou du nom de l'attribut:

//attribute::*[contains(., 'Foo')]/..

Bien sûr, si vous êtes plus intéressé par le contenu de l'attribut lui-même, et pas nécessairement son nœud parent, supprimez simplement le/..

//attribute::*[contains(., 'Foo')]
22
Alex Beynenson
descendant-or-self::*[contains(@prop,'Foo')]

Ou:

/bla/a[contains(@prop,'Foo')]

Ou:

/bla/a[position() <= 3]

Disséqué:

descendant-or-self::

The Axis - recherchez dans chaque noeud situé en dessous et dans le noeud lui-même. Il vaut souvent mieux dire cela que //. J'ai rencontré des implémentations où // signifie n'importe où (décroissant ou autonome du nœud racine). L'autre utilise l'axe par défaut.

* or /bla/a

La balise - une correspondance générique, et/bla/a est un chemin absolu.

[contains(@prop,'Foo')] or [position() <= 3]

La condition dans []. @prop est un raccourci pour attribut :: prop, car attribut est un autre axe de recherche. Vous pouvez également sélectionner les 3 premiers à l’aide de la fonction position ().

16
1729

John C est le plus proche, mais XPath est sensible à la casse. Le XPath correct serait donc:

/bla/a[contains(@prop, 'Foo')]
6
Metro Smurf

Si vous devez également faire correspondre le contenu du lien lui-même, utilisez text ():

//a[contains(@href,"/some_link")][text()="Click here"]

4
DevDude

Avez-vous essayé quelque chose comme:

// a [contient (@prop, "Foo")]

Je n'ai jamais utilisé la fonction contient auparavant, mais soupçonne que cela devrait fonctionner comme annoncé ...

4
toddk

/ bla/a [contient (@prop, "foo")]

2
David Hill

Pour le code ci-dessus ... // * [contient (@ prop, 'foo')]

1
digiguru

essaye ça:

// a [contient (@ prop, 'foo')]

cela devrait fonctionner pour toutes les balises "a" dans le document

1
Dani Duran