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 true
se 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-value
del 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-value
di 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-value
di un nodo di testo :
Il valore di stringa di un nodo di testo sono i dati dei caratteri.
Quindi, in sostanza, string-value
tutto 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 Street
all'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 Comment
elementi.
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 Street
e Comment
. Come tale, //*[contains(., 'BLAH ABC')]
partite i Home
, i Addr
, e gli Comment
elementi.
//*[contains(text(),'ABC')]
restituisce solo l'<Street>
elemento. Non restituisce antenati di<Street>
o<Comment>
.