Bagaimana saya bisa memeriksa apakah suatu nilai nol atau kosong dengan XSL ?
Misalnya, apakah categoryName
kosong? Saya menggunakan ketika memilih konstruksi.
Sebagai contoh:
<xsl:choose>
<xsl:when test="categoryName !=null">
<xsl:value-of select="categoryName " />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="other" />
</xsl:otherwise>
</xsl:choose>
xsl:when
untuk tes-simpul. Pertimbangkan<xsl:template match="Category[categoryName[not(node())]]">...
bersama dengan a<xsl:template match="Category">...
. Prosesor kemudian akan membuat keputusan yang tepat untuk Anda dan Anda tidak perlu menuliskan logika bisnis dalam sarangxsl:choose
lagi. Dalam banyak kasus, menggunakan templat yang cocok membuat lembar gaya penulisan lebih mudah.Jawaban:
Sunting : Ini mencakup interpretasi yang paling mungkin, menurut pendapat saya, tentang "[bukan] nol atau kosong" seperti yang disimpulkan dari pertanyaan, termasuk pseudo-code dan pengalaman awal saya sendiri dengan XSLT. Yaitu, "Apa yang setara dengan Java berikut?":
Untuk lebih jelasnya, misalnya, mengidentifikasi nol vs kosong, lihat jawaban johnvey di bawah ini dan / atau 'biola' XSLT yang telah saya adaptasi dari jawaban itu, yang mencakup opsi dalam komentar Michael Kay serta kemungkinan interpretasi keenam.
sumber
test="not(categoryName = '')"
. Jawaban yang diberikan akan kembali salah jika elemen categoryName tidak ada, yang menurut saya interpretasi pertanyaan membuatnya menjadi jawaban yang salah.<xsl:for-each select="root/*[matches(name(.), 'grp')]">
sehingga bisa digunakan di VS2010?Tidak ada informasi lain, saya akan menganggap XML berikut:
Contoh kasus penggunaan akan terlihat seperti:
sumber
</CategoryName>
? , tes string kosong tidak berfungsi untuk ini</CategoryName>
, juga tidak perlu.Dari Elemen Kosong :
Untuk menguji apakah nilai node tertentu kosong
Itu tergantung pada apa yang Anda maksud dengan kosong.
not(node())
not(string(.))
not(normalize-space(.))
not(node()[not(self::comment())])
sumber
not(text())
. Alternatif untuk peluru ke-2 Anda juganot(.//text())
. Seperti yang ditunjukkan oleh peluru terakhir Anda: ada banyak cara untuk mempertimbangkan "ketiadaan";).if ($mystring) then ... else ...
Bagaimana dengan?
sumber
<categoryName> <!-- some comment --> </categoryName>
dan sebaliknya tidak ada teks yang bermakna, ini masih dievaluasi untuktrue
Dua kesepakatan pertama dengan nilai nol dan dua kesepakatan kedua dengan string kosong.
sumber
xsl:apply-templates
dan sesuaikan template untuk mendapatkan yang Anda inginkan, jauh lebih mudah.Dalam beberapa kasus, Anda mungkin ingin tahu kapan nilainya secara khusus nol, yang sangat diperlukan saat menggunakan XML yang telah diserialisasi dari objek .NET. Sementara jawaban yang diterima berfungsi untuk ini, itu juga mengembalikan hasil yang sama ketika string kosong atau kosong, yaitu '', sehingga Anda tidak dapat membedakan.
Jadi, Anda cukup menguji atributnya.
Kadang-kadang perlu untuk mengetahui keadaan sebenarnya dan Anda tidak bisa begitu saja memeriksa apakah CategoryName adalah instantiated, karena tidak seperti mengatakan Javascript
Akan mengembalikan true untuk elemen nol.
sumber
Saya tahu pertanyaan ini sudah tua, tetapi di antara semua jawaban, saya kehilangan satu yang merupakan pendekatan umum untuk kasus penggunaan ini dalam pengembangan XSLT.
Saya membayangkan bahwa kode yang hilang dari OP terlihat seperti ini:
Dan inputnya terlihat seperti ini:
Yaitu, saya berasumsi mungkin ada nol, kosong,
categoryName
elemen tunggal atau ganda . Untuk menangani semua kasus ini menggunakanxsl:choose
konstruksi gaya, atau dengan kata lain, secara imperatif, dengan cepat menjadi berantakan (terlebih lagi jika elemen dapat berada pada level yang berbeda!). Sebuah idiom pemrograman tipikal dalam XSLT adalah menggunakan templat (maka T dalam XSLT), yang merupakan pemrograman deklaratif, bukan keharusan (Anda tidak memberi tahu prosesor apa yang harus dilakukan, Anda hanya memberi tahu apa yang Anda inginkan keluaran jika kondisi tertentu terpenuhi). Untuk kasus penggunaan ini, itu bisa terlihat seperti berikut:Ini berfungsi (dengan versi XSLT apa pun), karena yang pertama di atas memiliki prioritas lebih tinggi (memiliki predikat). Templat pencocokan "fall-through", yang kedua, menangkap apa pun yang tidak valid. Yang ketiga kemudian menangani menghasilkan
categoryName
nilai dengan cara yang tepat.Perhatikan bahwa dalam skenario ini tidak perlu mencocokkan secara spesifik
categories
ataucategory
, karena prosesor akan secara otomatis memproses semua anak, kecuali kami memberi tahu sebaliknya (dalam contoh ini, templat kedua dan ketiga tidak memproses lebih lanjut anak-anak, karena tidak adaxsl:apply-templates
dalam mereka).Pendekatan ini lebih mudah diperluas daripada pendekatan imperatif, karena pendekatan ini secara otomatis menangani beberapa kategori dan dapat diperluas untuk elemen atau pengecualian lainnya dengan hanya menambahkan templat pencocokan lain. Pemrograman tanpa if-branch .
Catatan: tidak ada yang namanya
null
XML. Ada xsi: nihil , tapi itu jarang digunakan, terutama jarang dalam skenario yang tidak diketik tanpa skema.sumber
Ini mungkin ekspresi XPath yang paling sederhana (yang ada di jawaban yang diterima memberikan tes untuk kebalikannya, dan akan lebih lama, jika dinegasikan):
Penjelasan :
Argumen untuk
not()
fungsi di atas adalahfalse()
tepat ketika tidak adacategoryName
anak ("null") dari item konteks, atau anak (tunggal tersebut)categoryName
memiliki nilai string - string kosong.Dalam penggunaan XSLT 2.0 :
Ini adalah contoh lengkapnya :
Ketika transformasi ini diterapkan pada dokumen XML berikut:
hasil yang diinginkan dan benar dihasilkan :
Ketika diterapkan pada dokumen XML ini :
atau ini:
atau ini
hasil yang benar dihasilkan :
Demikian pula, gunakan transformasi XSLT 1.0 ini :
Perhatikan : Tidak ada persyaratan yang digunakan sama sekali. Pelajari lebih lanjut tentang pentingnya menghindari konstruksi kondisional dalam kursus Pluralsight yang bagus ini:
" Pola Desain Taktis di .NET: Alur Kontrol "
sumber
Jika ada kemungkinan elemen tidak ada dalam XML, saya akan menguji apakah elemen tersebut ada dan panjang senarnya lebih besar dari nol:
sumber
categoryName
ketika tidak adacategoryName
elemen turunan dalam konteks saat ini) didefinisikan sebagai string kosong, jadi ini berlebihan -string-length(categoryName)
adalah nol jika tidak adacategoryName
elemen.Jika sebuah simpul tidak memiliki nilai yang tersedia di input xml seperti di bawah xpath,
fungsi string () dikonversi menjadi nilai kosong. Jadi ini berfungsi dengan baik:
sumber
Sesuatu seperti ini bekerja untuk saya:
Atau sebaliknya:
Catatan: Jika Anda tidak memeriksa nilai nol atau menangani nilai nol, IE7 mengembalikan -2147483648 alih-alih NaN.
sumber
Saya benar-benar menemukan itu lebih baik hanya menguji panjang string karena berkali-kali bidang ini tidak nol, hanya kosong
sumber
Menurut pengalaman saya, cara terbaik adalah:
sumber
Gunakan categoryName / teks sederhana () Tes tersebut berfungsi dengan baik
<categoryName/>
dan juga<categoryName></categoryName>
.sumber