Qual è XPath corretto per la scelta degli attributi che contengono & # 8220; foo & # 8221 ;?
Domanda
Dato questo XML, ciò che XPath restituisce tutti gli elementi il ??cui attributo prop
contiene Foo
(i primi tre nodi):
<bla>
<a prop="Foo1"/>
<a prop="Foo2"/>
<a prop="3Foo"/>
<a prop="Bar"/>
</bla>
Soluzione
//a[contains(@prop,'Foo')]
Funziona se uso questo XML per ottenere risultati.
<bla>
<a prop="Foo1">a</a>
<a prop="Foo2">b</a>
<a prop="3Foo">c</a>
<a prop="Bar">a</a>
</bla>
Modifica: Un'altra cosa da notare è che mentre XPath sopra restituirà la risposta corretta per quel particolare xml, se vuoi garantire di ottenere solo il " a " elementi nell'elemento "bla", dovresti usare come altri
/bla/a[contains(@prop,'Foo')]
Questo ti cercherà tutti " a " elementi nell'intero documento XML, indipendentemente dal fatto che siano nidificati in un "blah" elemento
//a[contains(@prop,'Foo')]
L'ho aggiunto per completezza e nello spirito di StackOverflow. :)
Altri suggerimenti
Questo XPath ti darà tutti i nodi che hanno attributi contenenti 'Foo' indipendentemente dal nome del nodo o dal nome dell'attributo:
//attribute::*[contains(., 'Foo')]/..
Naturalmente, se sei più interessato al contenuto dell'attributo stesso, e non necessariamente al loro nodo genitore, lascia cadere il / ..
//attribute::*[contains(., 'Foo')]
descendant-or-self::*[contains(@prop,'Foo')]
o
/bla/a[contains(@prop,'Foo')]
o
/bla/a[position() <= 3]
Dissected:
descendant-or-self::
L'Asse: cerca in ogni nodo sottostante e nel nodo stesso. Spesso è meglio dire questo che //. Ho riscontrato alcune implementazioni in cui // significa ovunque (decente o sé del nodo radice). L'altro utilizza l'asse predefinito.
* or /bla/a
Il tag - una corrispondenza jolly e / bla / a è un percorso assoluto.
[contains(@prop,'Foo')] or [position() <= 3]
La condizione in []. @prop è una scorciatoia per attributo :: prop, poiché l'attributo è un altro asse di ricerca. In alternativa puoi selezionare i primi 3 usando la funzione position ().
John C è il più vicino, ma XPath distingue tra maiuscole e minuscole, quindi XPath corretto sarebbe:
/bla/a[contains(@prop, 'Foo')]
Hai provato qualcosa del tipo:
// a [contiene (@prop, " Foo ")]
Non ho mai usato prima la funzione contiene ma sospetto che dovrebbe funzionare come pubblicizzato ...
Se devi anche abbinare il contenuto del link stesso, usa text ():
// a [contiene (@ href, " / some_link ")] [text () = " Fai clic qui "]
/ bla / a [contiene (@prop, " foo ")]
Per il codice sopra ... // * [contiene (@ prop, 'foo')]
prova questo:
// un [contiene (@ prop, 'pippo')]
che dovrebbe funzionare per qualsiasi " a " tag nel documento