Qual è XPath corretto per la scelta degli attributi che contengono "pippo"?


176

Dato questo XML, ciò che XPath restituisce tutti gli elementi il ​​cui propattributo contiene Foo(i primi tre nodi):

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

1
Perché tutti guardano l'attributo "prop"? Ho dimenticato qualcosa? Dice solo ottenere i primi tre nodi.

6
Tutti stanno guardando l'attributo prop perché è quello che è stato chiesto. Ottieni tutti i nodi in cui prop contiene "Foo". Aggiungi <a prop="Foo5" /> e vedrai perché non sono solo "i primi tre nodi" ..
erlando,

La domanda nel corpo è mal formulata, indipendentemente dal titolo. Foo può davvero essere in qualsiasi attributo prop o vuoi seriamente solo i primi tre nodi?

3
Sì, fai riferimento al titolo per favore (e sentiti libero di modificare).
ripper234,

Se hai bisogno di un confronto senza distinzione tra maiuscole e minuscole, vedi trova-un-elemento-il cui attributo-contiene-un-testo-maiuscole e minuscole
Michael Freidgeim,

Risposte:


307
//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 gli elementi "a" nell'elemento "bla", dovresti come altri hanno già detto

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

Questo cercherà tutti gli elementi "a" nell'intero documento XML, indipendentemente dal fatto che siano nidificati in un elemento "blah"

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

L'ho aggiunto per completezza e nello spirito di StackOverflow. :)


3
xmlme.comora reindirizza a qualche altro host e non sembra ospitare lo strumento o qualcosa di simile.
jpmc26,

26

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 ai contenuti dell'attributo stesso e non necessariamente al loro nodo genitore, basta rilasciare il / ..

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

2
Per tutti i nodi//@*[contains(., 'Foo')]
aliopi,

16
descendant-or-self::*[contains(@prop,'Foo')]

O:

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

O:

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

sezionato:

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 all'interno di []. @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 ().


6

John C è il più vicino, ma XPath distingue tra maiuscole e minuscole, quindi XPath corretto sarebbe:

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

4

Hai provato qualcosa del tipo:

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

Non ho mai usato la funzione contiene prima ma sospetto che dovrebbe funzionare come pubblicizzato ...


@toddk ... hai scelto come target un attributo inesistente: @foo. Vorresti scegliere come target @prop ;-)
Metro Puffo,

4

Se devi anche abbinare il contenuto del link stesso, usa text ():

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



1

Per il codice sopra ... // * [contiene (@ prop, 'foo')]


questo vale per qualsiasi elemento con foo in, ma l'attributo deve essere "prop"
digiguru,

1

prova questo:

// un [contiene (@ prop, 'pippo')]

che dovrebbe funzionare per qualsiasi tag "a" nel documento

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.