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:
<xsl:template match="category">
<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>
</category>
Dan inputnya terlihat seperti ini:
<categories>
<category>
<categoryName>Books</categoryName>
</category>
<category>
<categoryName>Magazines</categoryName>
<categoryName>Periodicals</categoryName>
<categoryName>Journals</categoryName>
</category>
<category>
<categoryName><!-- please fill in category --></categoryName>
</category>
<category>
<categoryName />
</category>
<category />
</categories>
Yaitu, saya berasumsi mungkin ada nol, kosong, categoryNameelemen tunggal atau ganda . Untuk menangani semua kasus ini menggunakan xsl:choosekonstruksi 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:
<!-- positive test, any category with a valid categoryName -->
<xsl:template match="category[categoryName[text()]]">
<xsl:apply-templates />
</xsl:template>
<!-- any other category (without categoryName, "null", with comments etc) -->
<xsl:template match="category">
<xsl:text>Category: Other</xsl:text>
</xsl:template>
<!-- matching the categoryName itself for easy handling of multiple names -->
<xsl:template match="categoryName">
<xsl:text>Category: </xsl:text>
<xsl:value-of select="." />
</xsl:template>
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 categoryNamenilai dengan cara yang tepat.
Perhatikan bahwa dalam skenario ini tidak perlu mencocokkan secara spesifik categoriesatau category, 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 ada xsl:apply-templatesdalam 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 nullXML. Ada xsi: nihil , tapi itu jarang digunakan, terutama jarang dalam skenario yang tidak diketik tanpa skema.