Bu sorunun eski olduğunu biliyorum, ancak tüm cevaplar arasında, XSLT geliştirmedeki bu kullanım durumu için ortak bir yaklaşım olanı özlüyorum.
Ben OP eksik kodu böyle bir şey görünüyor hayal ediyorum:
<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>
Ve girdinin şöyle görünmesi:
<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>
Yani, sıfır, boş, tek veya birden fazla categoryName
eleman olabileceğini varsayıyorum . Tüm bu durumlarla xsl:choose
-style yapıları kullanarak veya başka bir deyişle, zorunlulukla uğraşmak hızla dağınık hale gelir (hatta unsurlar farklı seviyelerde olabilirse!). XSLT'deki tipik bir programlama deyimi, şablonlar kullanır (dolayısıyla XSLT'deki T), zorunlu programlama değildir, zorunlu değildir (işlemciye ne yapması gerektiğini söylemezsiniz, sadece belirli koşullar karşılandığında hangi çıktıyı istediğinizi söylersiniz). Bu kullanım durumunda, bu aşağıdaki gibi görünebilir:
<!-- 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>
Bu (herhangi bir XSLT sürümü ile) çalışır, çünkü yukarıdaki ilkinin daha yüksek bir önceliği vardır (bir yüklemi vardır). "Düşen" eşleme şablonu, ikincisi, geçerli olmayan her şeyi yakalar. Üçüncüsü, categoryName
değerin uygun bir şekilde çıkarılmasına özen gösterir .
Bu senaryoya göre specifially maç için gerek olmadığını Not categories
veya category
hiç olmadığından işlemci otomatik olarak tüm çocukları işleyecek çünkü siz başka bir şey olmadıkça, (bu örnekte, ikinci ve üçüncü şablon, çocuk ileri değil işlemi yapmak xsl:apply-templates
içinde onları).
Bu yaklaşım, zorunlu yaklaşımdan daha kolay genişletilebilir, çünkü otomatik olarak birden fazla kategoriyle ilgilenir ve sadece başka bir eşleşen şablon ekleyerek diğer öğeler veya istisnalar için genişletilebilir. İflasız programlama .
Not: null
XML'de olduğu gibi bir şey yoktur . Orada xsi: nil , ama bu nadiren bir çeşit şema olmadan türsüz senaryolarda özellikle nadiren kullanılır.