Я знаю, що це питання давнє, але між усіма відповідями я пропускаю один, який є загальним підходом до цього випадку використання в розробці XSLT.
Я уявляю, що пропущений код з ОП виглядає приблизно так:
<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>
І що вхід виглядає приблизно так:
<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>
Тобто, я припускаю, що може бути нульовий, порожній, одинарний або кілька categoryName
елементів. Впоратися з усіма цими випадками за допомогою xsl:choose
конструкцій -style, або іншими словами, обов'язково, швидко стає безладним (тим більше, якщо елементи можуть бути на різних рівнях!). Типова ідіома програмування в XSLT - це використання шаблонів (отже, T у XSLT), що є декларативним програмуванням, а не обов'язковим (ви не говорите процесору, що робити, ви просто повідомте, що ви хочете вивести, якщо будуть виконані певні умови). У цьому випадку використання може виглядати приблизно так:
<!-- 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>
Це працює (з будь-якою версією XSLT), оскільки перша вище має перевагу (має присудок). Шаблон відповідності "пропускний", другий, вловлює все, що недійсне. Потім третій піклується про вихідcategoryName
значення належним чином.
Зауважте, що в цьому сценарії немає необхідності в точній відповідності categories
або category
, оскільки процесор автоматично обробляє всіх дітей, якщо ми не скажемо це інакше (у цьому прикладі другий і третій шаблони не обробляють дітей далі, оскільки немаєxsl:apply-templates
в їх).
Цей підхід легше розширити, ніж імперативний підхід, оскільки він автоматично обробляє декілька категорій і його можна розширити для інших елементів або винятків, просто додавши ще один узгоджений шаблон. Програмування без if-філій .
Примітка. Немає такого поняття, як null
у XML. Є xsi: nil , але це рідко використовується, особливо рідко в нетипових сценаріях без якоїсь схеми.