Условные выражения в XSLT являются одинарными "если":
<xsl:if test="some Boolean condition">
<!-- "if" stuff (there is no "else" here) -->
</xsl:if>
или более как оператор переключения других языков:
<xsl:choose>
<xsl:when test="some Boolean condition">
<!-- "if" stuff -->
</xsl:when>
<xsl:otherwise>
<!-- "else" stuff -->
</xsl:otherwise>
</xsl:choose>
, где есть место для столько <xsl:when>
, сколько вам нужно.
Каждое выражение XPath может быть оценено как логическое значение в соответствии с набором правил . Они (по большей части) сводятся к "если есть что -> true
" / "если ничего нет -> false
"
- пустая строка
false
- 0 равно
false
(как и NaN
)
- пустой набор узлов:
false
- результат
false()
равен false
- каждое другое буквальное значение равно
true
(в частности: 'false'
равно true
и '0'
равно true
)
- результат выражений оценивается по указанным правилам (здесь нет ничего удивительного)
Редактировать: Конечно, есть более продвинутый (и более идиоматический) метод управления потоком программ, и это сопоставление с шаблоном:
<xsl:template match="node[contains(., 'some text')]">
<!-- output X -->
</xsl:template>
<xsl:template match="node[not(contains(., 'some text'))]">
<!-- output Y -->
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select=".//node" />
</xsl:template>
Написание шаблонов, соответствующих конкретным узлам, и использование <xsl:apply-templates>
, чтобы заставить процессор XSLT выбирать подходящие, лучше, чем написание сложных <xsl:if>
или <xsl:choose>
конструкций.
Приведенный выше образец соответствует императивному стилю:
<xsl:template match="/">
<xsl:for-each select=".//node">
<xsl:choose>
<xsl:when test="contains(., 'some text')">
<!-- output X -->
</xsl:when>
<xsl:when test="not(contains(., 'some text'))">
<!-- output Y -->
</xsl:when>
<xsl:choose>
<xsl:for-each>
</xsl:template>
Новички в XSLT обычно выбирают последнюю форму для ее знакомства, но стоит изучить сопоставление с шаблоном вместо использования условных выражений. (также см. .)