Masalahnya adalah saya tahu cara mengakses node tertentu, tetapi saya tidak tahu mengakses node jika saudara kandung memiliki nilai tertentu. Bisakah itu menjadi sesuatu seperti ini / a / cc / contains (/ a / bb = 'zz')?
HOE SENGKIANG
Jawaban:
101
Tidak yakin mengapa semua orang menanyakan saudara kandung, Anda juga dapat memeriksa <bb/>-elements yang cocok dengan predikat dari <a/>predikat:
@HOESENGKIANG: Anda harus mengklik tanda centang untuk "menerima" jawaban ini, atau siapa pun yang menurut Anda paling menjawab pertanyaan.
LarsH
23
T: Bagaimana cara memilih node menggunakan XPath jika node saudara memiliki nilai tertentu?
Karena hanya ada "Sumbu XPath" untuk saudara berikut dan saudara sebelumnya, Anda dapat menggunakan salah satu dari mereka jika posisinya ditetapkan.
Tetapi lebih baik:
Carilah jika ccorang tua memiliki anak bbdengan nilai 'zz':
Tidak yakin apa yang Anda maksud dengan 'hanya "XPath Axes" untuk saudara-saudara berikut dan saudara-saudara sebelumnya'. Apakah Anda mengacu pada fakta bahwa tidak ada satu sumbu untuk semua saudara kandung?
LarsH
@ LarsH: Ya maaf, (maafkan bahasa Inggris saya yang buruk :-() - itulah yang ingin saya katakan. (Karena pertanyaannya untuk saudara kandung.)
hr_117
6
Pertama, contoh Anda bukanlah XML dengan format yang baik. Melihat itu dan bahwa Anda tidak menggambarkan maksud Anda dengan baik (Apa sebenarnya yang ingin Anda pilih dalam kondisi apa?), Saya berasumsi Anda ingin melakukan ini:
//cc[preceding-sibling::bb[text()="zz"]]/text()
Itu memilih
TEXT VALUES OF ALL <CC> ELEMENTS
//cc /text()
THAT HAVE A PRECEDING SIBLING <BB>
[preceding-sibling::bb ]
THAT HAS TEXT VALUE EQUAL TO "zz"
[text()="zz"]
Anda bisa menulis juga sebagai
//bb[text()="zz"]/following-sibling::cc/text()
Silakan lihat spesifikasinya , ini memiliki beberapa contoh yang dapat dibaca dengan sangat baik dari mana Anda akan belajar banyak.
Penjelasan : Setiap bbyang berisi 'zz'string di semua node anak bbkemudian pergi ke node induk yang bbmenggunakan .., sekarang kita dapat mengakses ccteks yang kembali.
Jawaban:
Tidak yakin mengapa semua orang menanyakan saudara kandung, Anda juga dapat memeriksa
<bb/>
-elements yang cocok dengan predikat dari<a/>
predikat:sumber
*-sibling
sumbu. +1 sekalipun.Yang Anda butuhkan adalah
following-sibling
sumbu XPathUji Xpath di sini: http://www.xpathtester.com/obj/b55ec3ac-dfa4-4f44-81e8-f963ea4a0625
sumber
T: Bagaimana cara memilih node menggunakan XPath jika node saudara memiliki nilai tertentu?
Karena hanya ada "Sumbu XPath" untuk saudara berikut dan saudara sebelumnya, Anda dapat menggunakan salah satu dari mereka jika posisinya ditetapkan.
Tetapi lebih baik: Carilah jika
cc
orang tua memiliki anakbb
dengan nilai'zz'
:sumber
//a[bb = 'zz']/cc
.Pertama, contoh Anda bukanlah XML dengan format yang baik. Melihat itu dan bahwa Anda tidak menggambarkan maksud Anda dengan baik (Apa sebenarnya yang ingin Anda pilih dalam kondisi apa?), Saya berasumsi Anda ingin melakukan ini:
Itu memilih
TEXT VALUES OF ALL <CC> ELEMENTS //cc /text() THAT HAVE A PRECEDING SIBLING <BB> [preceding-sibling::bb ] THAT HAS TEXT VALUE EQUAL TO "zz" [text()="zz"]
Anda bisa menulis juga sebagai
Silakan lihat spesifikasinya , ini memiliki beberapa contoh yang dapat dibaca dengan sangat baik dari mana Anda akan belajar banyak.
sumber
// a: Memilih semua elemen 'a' dimanapun itu.
// a / cc: Memilih elemen 'cc' yang merupakan turunan dari elemen 'a' (di mana pun a berada).
..: Memilih induk dari node saat ini.
[../bb='zz ']: dimana nilai dari elemen sibling' bb 'adalah zz.
Referensi: http://www.w3schools.com/xsl/xpath_syntax.asp
sumber
Solusi lain untuk masalah ini adalah
//bb[contains(.,'zz')]/../cc/text()
Penjelasan : Setiap
bb
yang berisi'zz'
string di semua node anakbb
kemudian pergi ke node induk yangbb
menggunakan..
, sekarang kita dapat mengaksescc
teks yang kembali.Saya harap penjelasan itu tidak rumit.
sumber