Dengan format data yang disederhanakan ini:
<a>
<b>
<c>C1</c>
<d>D1</d>
<e>E1</e>
<f>don't select this one</f>
</b>
<b>
<c>C2</c>
<d>D2</d>
<e>E1</e>
<g>don't select me</g>
</b>
<c>not this one</c>
<d>nor this one</d>
<e>definitely not this one</e>
</a>
Bagaimana Anda memilih semua elemen C
, D
dan elemen E
yang merupakan anak-anak B
elemen?
Pada dasarnya, sesuatu seperti:
a/b/(c|d|e)
Dalam situasi saya sendiri, bukan hanya a/b/
, query yang mengarah ke memilih mereka C
, D
, E
node sebenarnya cukup kompleks jadi saya ingin menghindari melakukan hal ini:
a/b/c|a/b/d|a/b/e
Apakah ini mungkin?
or
adalah operator logis - beroperasi pada dua nilai Boolean. Operator serikat XPath|
beroperasi pada dua set node. Ini sangat berbeda dan ada kasus penggunaan khusus untuk masing-masing. Menggunakan|
dapat memecahkan masalah asli, tetapi menghasilkan lebih lama dan lebih kompleks dan menantang untuk memahami ekspresi XPath. Ekspresi yang lebih sederhana dalam jawaban ini, yang menggunakanor
operator menghasilkan set simpul yang diinginkan dan dapat ditentukan dalam atribut "pilih" dari<xsl:for-each>
operasi XSLT. Cobalah.local-name()
hanya benar jika kita ingin memilih semua elemen dengan nama lokal itu, terlepas dari namespace tempat elemen tersebut berada. Ini adalah kasus yang sangat jarang - pada umumnya orang peduli tentang perbedaan antara:kitchen:table
dansql:table
, atau di antaraarchitecture:column
,sql:column
,array:column
,military:column
Anda bisa menghindari pengulangan dengan tes atribut sebagai gantinya:
Bertentangan dengan pendapat antagonis Dimitre, hal di atas tidak salah dalam ruang hampa di mana OP belum menentukan interaksi dengan ruang nama. The
self::
sumbu namespace membatasi,local-name()
tidak. Jika niat OP adalah untuk menangkapc|d|e
terlepas dari namespace (yang saya sarankan bahkan skenario yang mungkin diberikan sifat ATAU dari masalah) maka itu adalah "jawaban lain yang masih memiliki beberapa suara positif" yang tidak benar.Anda tidak dapat menjadi pasti tanpa definisi, meskipun saya cukup senang menghapus jawaban saya sebagai benar-benar salah jika OP mengklarifikasi pertanyaannya sehingga saya salah.
sumber
local-name()
, apakah itu berarti itu akan cocok dengan tag dengan namespace apa pun? Jika saya menggunakanself::
, namespace apa yang harus cocok? Bagaimana saya hanya cocokOhMy:c
?Mengapa tidak
a/b/(c|d|e)
? Saya baru saja mencoba dengan perpustakaan XML Saxon (dibungkus dengan baik dengan beberapa kebaikan Clojure), dan tampaknya berhasil.abc.xml
adalah dokumen yang dijelaskan oleh OP.sumber
Tidak yakin apakah ini membantu, tetapi dengan XSL, saya akan melakukan sesuatu seperti:
dan bukankah XPath ini akan memilih semua anak dari simpul B:
sumber