Я знаю, этот вопрос старый, но между всеми ответами, я скучаю тот, который является общим подходом для этого сценария использования в развитии XSLT.
Я воображал, что недостающий код из OP выглядит примерно так:
<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
, или, другими словами, настоятельно, быстро становится беспорядочным (тем более, если элементы могут быть на разных уровнях!). Типичная идиома программирования в 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-ветвей.
Примечание: в XML отсутствует такая вещь, как null
.Существует xsi:nil, но это редко используется, особенно редко в нетипизированных сценариях без какой-либо схемы.
вы можете расширить пример кода? –
В зависимости от вашего прецедента вы, вероятно, не хотите использовать 'xsl: when' для узлов-тестов. Рассмотрим ' ...' вместе с ' ...'. Затем процессор примет правильные решения для вас, и вам больше не нужно будет выписывать бизнес-логику в вложенном 'xsl: select'. Во многих случаях использование совпадающих шаблонов упрощает создание таблиц стилей. –
Abel