XPath - Memilih elemen yang sama nilainya

110

Di Xpath, saya ingin memilih elemen yang sama dengan nilai tertentu.

Contoh data XML:

<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>

Sekarang, menggunakan XPath:

//ccc[.='qwerty']

Saya mendapatkan hasil yang benar dan diharapkan :

Name    Value
ccc     qwerty

Sekarang, menggunakan XPath:

//aaa[.='qwerty']

Saya mendapatkan hasil yang tidak terduga :

Name    Value
aaa      
aaa     qwerty

Dan yang paling saya minati adalah bagaimana memilih elemen apa pun dengan nilai itu

XPath:

//*[.='qwerty']

Saya mendapatkan hasil tak terduga yang sangat aneh :

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

Adakah yang bisa menjelaskan hasil ini, dan cara memperbaiki ekspresi XPath saya untuk mendapatkan hasil yang lebih diharapkan?

pengembang
sumber
1
Karena XPath . =berbeda dengan XPath text() =. Lihat perbedaan node teks yang cocok dengan nilai string yang cocok untuk mempelajari alasannya.
kjhughes

Jawaban:

178

Spesifikasi XPath. mendefinisikan nilai string sebuah elemen sebagai rangkaian (dalam urutan dokumen) dari semua turunan node teksnya .

Ini menjelaskan "hasil yang aneh".

Hasil "lebih baik" dapat diperoleh dengan menggunakan ekspresi di bawah ini:

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

Di atas memilih setiap elemen dalam dokumen yang memiliki setidaknya satu anak node teks dengan nilai 'qwerty'.

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

Di atas memilih setiap elemen dalam dokumen yang hanya memiliki satu anak node teks dan nilainya adalah: 'qwerty'.

Dimitre Novatchev
sumber
3
@iHeartGreek: Senang berhasil. Bagaimana dengan menerima / upvoting? text()adalah salah satu tes node yang mungkin di XPath, yang berarti "apakah ini node teks?". Nodetests lain comment(), processing-instruction()atau hanya node().
Dimitre Novatchev
15

Mencoba

//*[text()='qwerty']karena elemen .Anda saat ini

Gregoire
sumber