В XSLT в шаблоне обработку с условием поддерживают две инструкции: xsl:if
и xsl:choose
. Инструкция xsl:if
дает простую функциональность if-then, инструкция xsl:choose
поддерживает выбор одного из нескольких возможных вариантов.
xsl:if
<!-- Category:
instruction -->
<xsl:if
test =
boolean-expression>
<!-- Content:
template -->
</xsl:if>
Элемент xsl:if
имеет атрибут test
, который определяет некое выражение. Содержимое элемента является шаблоном. Указанное выражение обрабатывается, а полученный объект преобразуется в булево значение как при вызове функции boolean. Если результатом является true, то подставляется шаблон, имеющийся в выражении. В противном случае не создается ничего. В следующем примере группа имен оформляется в виде списка через запятую:
<xsl:template match="namelist/name"> <xsl:apply-templates/> <xsl:if test="not(position()=last())">, </xsl:if> </xsl:template>
В следующем примере каждый второй ряд таблицы раскрашивается желтым:
<xsl:template match="item"> <tr> <xsl:if test="position() mod 2 = 0"> <xsl:attribute name="bgcolor">yellow</xsl:attribute> </xsl:if> <xsl:apply-templates/> </tr> </xsl:template>
xsl:choose
<!-- Category:
instruction -->
<xsl:choose>
<!-- Content: (xsl:when+, xsl:otherwise?)
-->
</xsl:choose>
<xsl:when
test =
boolean-expression>
<!-- Content:
template -->
</xsl:when>
<xsl:otherwise>
<!--
Content: template -->
</xsl:otherwise>
Среди нескольких возможных альтернатив элемент xsl:choose
выбирает одну. Он состоит из последовательности элементов xsl:when
, за которой следует необязательный элемент xsl:otherwise
. Каждый элемент xsl:when
имеет единственный атрибут test
, который задает некое выражение. Содержимое элементов xsl:when
и xsl:otherwise
является шаблоном. Если обрабатывается элемент xsl:choose
, поочередно проверяются все элементы xsl:when
. При этом обрабатывается соответствующее выражение, а полученный объект преобразуется в булевый тип как при вызове функции boolean. Обрабатывается содержимое первого, и только первого элемента xsl:when
, при проверке которого было получено true. Если ни один из xsl:when
не показал true, подставляется значение элемента xsl:otherwise
. Если ни один из xsl:when
не показал true, а элемент xsl:otherwise
отсутствует, то ничего не создается.
В следующем примере пункты в упорядоченном списке нумеруются с помощью арабских цифр, букв или римских цифр в зависимости от глубины вложенности упорядоченных списков.
<xsl:template match="orderedlist/listitem"> <fo:list-item indent-start='2pi'> <fo:list-item-label> <xsl:variable name="level" select="count(ancestor::orderedlist) mod 3"/> <xsl:choose> <xsl:when test='$level=1'> <xsl:number format="i"/> </xsl:when> <xsl:when test='$level=2'> <xsl:number format="a"/> </xsl:when> <xsl:otherwise> <xsl:number format="1"/> </xsl:otherwise> </xsl:choose> <xsl:text>. </xsl:text> </fo:list-item-label> <fo:list-item-body> <xsl:apply-templates/> </fo:list-item-body> </fo:list-item> </xsl:template>
Назад | Содержание | Вперед