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

StackOverflow https://stackoverflow.com/questions/103325

  •  01-07-2019
  •  | 
  •  

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>
Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top