2010-06-08 13 views
50

In questo xml, voglio corrispondere, l'elemento contenente 'match' (elemento random2)XPath per restituire solo gli elementi che contengono il testo, e non i suoi genitori

<root> 
<random1> 
    <random2>match</random2> 
    <random3>nomatch</random3> 
</random1> 
</root> 

ok, finora ho:

//[re:test(.,'match','i')] (with re in the proper namespace) 

restituisce random2, random1 e radice ... vorrei ottenere solo "random2"

tutte le idee?

+0

Stai cercando di abbinare se contiene la parola in qualsiasi parte del testo (ad esempio "vedere se questo sarà * partite * la parola"), o solo gli elementi che hanno un valore pari a "match "(ignorando gli spazi bianchi circostanti)? –

+0

non è rilevante, o funzionerebbe. Il problema consisteva principalmente nel restituire i suoi genitori allo stesso modo – julian

risposta

99

Vuoi trovare elementi che contengono "match", o che pari "match"?

Questo troverà elementi che hanno i nodi di testo che la parità di 'match' (partite nessuno degli elementi a causa di spazi iniziali e finali in random2):

//*[text()='match'] 

Questo troverà tutti gli elementi che hanno nodi di testo uguali a "corrispondenza", dopo aver rimosso spazi vuoti iniziali e finali (corrisponde a random2):

//*/text()[normalize-space(.)='match']/parent::* 

Questo troverà tutti gli elementi che contengono 'match' nel valore nodo di testo (partite random2 e random3):

//*[contains(text(),'match')] 

Questo 2.0 soluzione XPath utilizza le corrispondenze() funzione e un pattern regex che cerca i nodi di testo che contengono 'match' e iniziano all'inizio della stringa (es ^) o un limite di parola (ad esempio \W) e terminato dalla fine della stringa (ad esempio $) o un limite di parola. Il terzo parametro i valuta il pattern regex senza distinzione tra maiuscole e minuscole. (Partite random2)

//*[matches(text(),'(^|\W)match($|\W)','i')] 
+0

La tua seconda affermazione non è vera. Suggerimento: prendi un elemento con più di un nodo di testo il cui primo nodo di testo non contiene "match". –

+0

Grazie a @Dimitre. Aggiornato con qualcosa che dovrebbe essere più robusto. –

+0

in realtà voglio eseguire una query specifica con espressioni regolari come '^ ma (t | T). *' Posso usare il primo? //*[text()='^ma(t|T).* '] giusto? – julian

Problemi correlati