XPath memilih node dengan beberapa nilai atribut sama dengan beberapa nilai atribut node lain [tertutup]

89
<grand id="grand">
  <parent>
    <child age="18" id="#not-grand"/>
    <child age="20" id="#grand"/> <!-- This is what I want to locate -->
  </parent>
</grand>

Adakah yang bisa memberi tahu saya cara mengungkapkan untuk menemukan anak kedua?

Ini tidak berhasil ...

"/grand/parent/child[@id=concat('#',/grand/@id)]/@age"

Terima kasih.


Maafkan saya. Ekspresinya oke. Saya menemukan saya mendapat beberapa masalah di area lain bukan ekspresi itu sendiri.

Jin Kwon
sumber
3
Xpath Anda berfungsi dengan baik untuk saya.
dogbane
3
Sama untuk saya - hanya mengujinya di sini dan memilih elemen anak kedua.
Andreas Dolk
2
Benar ... Ekspresinya oke. Maafkan saya. Saya telah membuat beberapa kesalahan dalam ekspresi (awalan namespace) dan dokumen contoh. Terima kasih.
Jin Kwon

Jawaban:

98

XPath ini khusus untuk cuplikan kode yang Anda berikan. Untuk memilih <child>dengan id sebagai #grandAnda dapat menulis //child[@id='#grand'].

Untuk mendapatkan usia //child[@id='#grand']/@age

Semoga ini membantu

Vaman Kulkarni
sumber
1
Terima kasih Vaman. Itu membantu. Maksud saya merujuk ekspresi ('/ grand / @ id') untuk evaluasi satu kali bukan nilai ('# grand') yang harus dievaluasi terlebih dahulu.
Jin Kwon
bagaimana jika XML saya memiliki daftar bagian dengan atribut nama lalu bagaimana cara memilihnya sebagai subDataSource? Contoh: <section name="valuation"> <capital-value> some data </capital-value> <location> some data </location> </section> <section name="subject-property"> <address>72 Gordon Avenue</address> <postcode>HA7 3QS</postcode> <bedrooms>2</bedrooms> </section>
Sanjay Sahani
30

Saya pikir inilah yang Anda inginkan:

/grand/parent/child[@id="#grand"]
MarcoS
sumber
2
Terima kasih MarcoS. Maksud saya merujuk ekspresi ('/ grand / @ id') untuk evaluasi satu kali bukan nilai ('# grand') yang harus dievaluasi terlebih dahulu.
Jin Kwon
2
@ jin-kwon: Begitu. Jadi, Anda XPath baik-baik saja.
MarcoS