Ответ 1
Условные обозначения в XSLT являются либо унарными "if":
<xsl:if test="some Boolean condition">
<!-- "if" stuff (there is no "else" here) -->
</xsl:if>
или больше как оператор switch других языков:
<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
) - пустой node набор
false
- результатом
false()
являетсяfalse
- любое другое литеральное значение
true
(наиболее заметно:'false'
istrue
и'0'
istrue
) - результат выражения оценивается с помощью указанных правил (здесь нет ничего удивительного)
Редактирование: существует, конечно, более продвинутый (и более идиоматический) метод управления потоком программы и соответствующий шаблон:
<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, как правило, выбирают последнюю форму для своего знакомства, но целесообразно рассмотреть совпадение шаблонов вместо использования условных выражений. (также см..)