Qual è l’XPath corretto per scegliere gli attributi che contengono “pippo”?

Dato questo XML, quale XPath restituisce tutti gli elementi il ​​cui attributo prop contiene Foo (i primi tre nodes):

       

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

Funziona se uso questo XML per ottenere risultati.

  a b c a  

Questo sito è ottimo per testare questo genere di cose

http://www.xmlme.com/XpathTool.aspx

Modifica: Un’altra cosa da notare è che mentre l’XPath sopra restituirà la risposta corretta per quel particolare xml, se vuoi garantire di ottenere solo gli elementi “a” nell’elemento “blah”, dovresti, come altri hanno menzionato, usare anche

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

Questo cercherà tutti gli elementi “a” nel tuo intero documento xml, indipendentemente dall’essere annidati in un elemento “blah”

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

L’ho aggiunto per completezza e nello spirito dello stackoverflow. 🙂

Questo XPath ti darà tutti i nodes che hanno attributi contenenti ‘Foo’ indipendentemente dal nome del nodo o dal nome dell’attributo:

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

Ovviamente, se sei più interessato ai contenuti dell’attributo stesso, e non necessariamente al loro nodo genitore, basta rilasciare il / ..

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

O:

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

O:

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

sezionato:

 descendant-or-self:: 

L'asse: cerca tra tutti i nodes sottostanti e il nodo stesso. Spesso è meglio dire questo che //. Ho incontrato alcune implementazioni dove // ​​significa ovunque (decantato o auto del nodo radice). L'altro usa l'asse predefinito.

 * or /bla/a 

Il tag: una corrispondenza con caratteri jolly e / bla / a è un percorso assoluto.

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

La condizione entro []. @prop è una scorciatoia per attributo :: prop, poiché l'attributo è un altro asse di ricerca. In alternativa è ansible selezionare i primi 3 utilizzando la funzione position ().

John C è il più vicino, ma XPath è case sensitive, quindi l’XPath corretto sarebbe:

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

Hai provato qualcosa del tipo:

// a [contains (@prop, “Foo”)]

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

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

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

/ bla / a [contiene (@prop, “foo”)]

Per il codice sopra … // * [contiene (@ prop, ‘foo’)]

prova questo:

// un [contiene (@ prop, ‘pippo’)]

dovrebbe funzionare per qualsiasi tag “a” nel documento