Il documento XML:
<Home>
<Addr>
<Street>ABC</Street>
<Number>5</Number>
<Comment>BLAH BLAH BLAH <br/><br/>ABC</Comment>
</Addr>
</Home>
L'espressione XPath:
//*[contains(text(), 'ABC')]
//*corrisponde a qualsiasi elemento discendente del nodo radice . Cioè, qualsiasi elemento tranne il nodo principale.
[...]è un predicato , filtra il set di nodi. Restituisce nodi per i quali ...è true:
Un predicato filtra un set di nodi [...] per produrre un nuovo set di nodi. Per ogni nodo nel set di nodi da filtrare, PredicateExpr viene valutato [...]; se PredicateExpr restituisce true per quel nodo, il nodo è incluso nel nuovo set di nodi; in caso contrario, non è incluso.
contains('haystack', 'needle')ritorna truese haystack contiene needle :
Funzione: booleano contiene (stringa, stringa)
La funzione contiene restituisce true se la prima stringa di argomenti contiene la seconda stringa di argomenti e in caso contrario restituisce false.
Ma contains()prende una stringa come primo parametro. Ed è passato nodi. Per far ciò, ogni nodo o set di nodi passato come primo parametro viene convertito in una stringa dalla string()funzione:
Un argomento viene convertito in tipo stringa come se chiamando la funzione stringa.
string()restituisce la funzione string-valuedel primo nodo :
Un set di nodi viene convertito in una stringa restituendo il valore di stringa del nodo nel set di nodi che è il primo nell'ordine del documento. Se il set di nodi è vuoto, viene restituita una stringa vuota.
string-valuedi un nodo elemento :
Il valore di stringa di un nodo elemento è la concatenazione dei valori di stringa di tutti i discendenti del nodo di testo del nodo elemento nell'ordine del documento.
string-valuedi un nodo di testo :
Il valore di stringa di un nodo di testo sono i dati dei caratteri.
Quindi, in sostanza, string-valuetutto il testo è contenuto in un nodo (concatenazione di tutti i nodi di testo discendenti).
text() è un test di nodo che corrisponde a qualsiasi nodo di testo:
Il testo di prova del nodo () è vero per qualsiasi nodo di testo. Ad esempio, child :: text () selezionerà i figli del nodo di testo del nodo di contesto.
Detto questo, //*[contains(text(), 'ABC')]corrisponde a qualsiasi elemento (tranne il nodo principale), il cui primo nodo di testo contiene ABC. Since text()restituisce un set di nodi che contiene tutti i nodi di testo figlio del nodo di contesto (rispetto al quale viene valutata un'espressione). Ma contains()prende solo il primo. Quindi per il documento sopra il percorso corrisponde Streetall'elemento.
L'espressione seguente //*[text()[contains(., 'ABC')]]corrisponde a qualsiasi elemento (tranne il nodo principale), che ha almeno un nodo di testo figlio, che contiene ABC. .rappresenta il nodo di contesto. In questo caso, è un nodo di testo figlio di qualsiasi elemento tranne il nodo principale. Quindi per il documento sopra il percorso corrisponde a Street, e agli Commentelementi.
Ora, quindi, //*[contains(., 'ABC')]corrisponde a qualsiasi elemento (tranne il nodo radice) che contiene ABC(nella concatenazione dei nodi di testo discendente). Per il documento sopra corrisponde agli elementi Home, the Addr, the Streete Comment. Come tale, //*[contains(., 'BLAH ABC')]partite i Home, i Addr, e gli Commentelementi.
//*[contains(text(),'ABC')]restituisce solo l'<Street>elemento. Non restituisce antenati di<Street>o<Comment>.