Quel est le XPath correct pour choisir des attributs contenant «foo»?
Question
É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>
La solution
//a[contains(@prop,'Foo')]
Fonctionne si j'utilise ce code 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>
Modifier: Une autre chose à noter est que bien que le XPath ci-dessus renvoie la réponse correcte pour ce XML particulier, si vous voulez garantir que vous n’obtiendrez que le "a" & le; éléments de l'élément "bla", vous devriez, comme d'autres l'ont déjà mentionné, utiliser
/bla/a[contains(@prop,'Foo')]
Ceci vous cherchera tous " un " éléments de votre document XML entier, qu’ils soient imbriqués dans un "blah" élément
//a[contains(@prop,'Foo')]
J'ai ajouté ceci dans un souci de minutie et dans l'esprit du stackoverflow. :)
Autres conseils
Ce XPath vous donnera tous les nœuds ayant 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')]
descendant-or-self::*[contains(@prop,'Foo')]
Ou:
/bla/a[contains(@prop,'Foo')]
Ou:
/bla/a[position() <= 3]
Dissected:
descendant-or-self::
The Axis - recherchez tous les nœuds situés en dessous et le nœud 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). Les autres utilisent l’axe par défaut.
* or /bla/a
La balise - un caractère 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 ().
John C est le plus proche, mais XPath est sensible à la casse. Le XPath correct serait donc:
/bla/a[contains(@prop, 'Foo')]
Avez-vous essayé quelque chose comme:
// a [contient (@prop, "Foo")]
Je n'ai jamais utilisé la fonction contient auparavant, mais je soupçonne qu'elle devrait fonctionner comme prévu ...
Si vous devez également faire correspondre le contenu du lien, utilisez text ():
// a [contient (@ href, "/ un_ lien")]] [text () = "Cliquez ici"]
/ bla / a [contient (@prop, "foo")]
Pour le code ci-dessus ... // * [contient (@ prop, 'foo')]
essayez ceci:
// a [contient (@ prop, 'foo')]
qui devrait fonctionner pour tout " un " balises dans le document