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, categoryName
elemen tunggal atau ganda . Untuk menangani semua kasus ini menggunakan xsl: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:
<!-- 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 categoryName
nilai dengan cara yang tepat.
Perhatikan bahwa dalam skenario ini tidak perlu mencocokkan secara spesifik categories
atau 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-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.