XPath: selezione di elementi uguali a un valore


110

In Xpath, voglio selezionare elementi che corrispondono a un valore specifico.

Dati XML di esempio:

<aaa id="11" >
    <aaa id="21" >
        <aaa id="31" ></aaa>
        <bbb id="32" >
            <aaa id="41" ></aaa>
            <bbb id="42" ></bbb>
            <ccc id="43" ></ccc>
            <ddd id="44" >qwerty</ddd>
            <ddd id="45" ></ddd>
            <ddd id="46" ></ddd>
        </bbb>
    </aaa>
    <bbb id="22" >
         <aaa id="33" >qwerty</aaa>
         <bbb id="34" ></bbb>
         <ccc id="35" ></ccc>
         <ddd id="36" ></ddd>
         <ddd id="37" ></ddd>
         <ddd id="38" ></ddd>
    </bbb>
    <ccc id="23" >qwerty</ccc>
    <ccc id="24" ></ccc>
 </aaa>

Ora, usando XPath:

//ccc[.='qwerty']

Ottengo i risultati corretti e attesi :

Name    Value
ccc     qwerty

Ora, usando XPath:

//aaa[.='qwerty']

Ottengo risultati inaspettati :

Name    Value
aaa      
aaa     qwerty

E quello che mi interessa particolarmente è come selezionare qualsiasi elemento con quel valore

XPath:

//*[.='qwerty']

Ottengo risultati inaspettati molto strani :

Name    Value
aaa
bbb
ddd     qwerty
bbb     qwerty
aaa     qwerty
ccc     qwerty

Qualcuno può spiegare questi risultati e come correggere le mie espressioni XPath per ottenere risultati più attesi?


1
Perché XPath . =è diverso da XPath text() =. Vedere la corrispondenza dei nodi di testo è diversa dalla corrispondenza dei valori di stringa per capire perché.
kjhughes

Risposte:


178

La specifica XPath. definisce il valore stringa di un elemento come la concatenazione (nell'ordine del documento) di tutti i suoi discendenti del nodo di testo .

Questo spiega gli "strani risultati".

È possibile ottenere risultati "migliori" utilizzando le espressioni seguenti:

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

Quanto sopra seleziona ogni elemento nel documento che ha almeno un nodo di testo figlio con valore 'qwerty'.

//*[text() = 'qwerty' and not(text()[2])]

Quanto sopra seleziona ogni elemento nel documento che ha un solo nodo di testo figlio e il suo valore è: 'qwerty'.


3
@iHeartGreek: Sono contento che funzioni. Che ne dici di accettare / votare? text()è uno dei possibili test dei nodi in XPath, che significa "è un nodo di testo?". Altri nodetests sono comment(), processing-instruction()o semplicemente node().
Dimitre Novatchev

15

Provare

//*[text()='qwerty']perché .è il tuo elemento attuale

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.