9.2 Обработка с условием 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>
<xsl:sort
select = string-expression
lang = { nmtoken }
data-type = { «text» | «number» | qname-but-not-ncname }
order = { «ascending» | «descending» }
case-order = { «upper-first» | «lower-first» } />
Сортировка задается с помощью элементов xsl:sort, данных как непосредственный потомок элемента xsl:apply-templates или xsl:for- each. Первый непосредственный потомок xsl:sort задает первичный ключ сортировки, второй непосредственный потомок xsl:sort задает вторичный ключ сортировки, и так далее. Если элемент xsl:apply-templates или xsl:for-each имеет одного или несколько непосредственных потомков xsl:sort, то вместо того чтобы обрабатывать выбранные узлы в том порядке как они следуют в документе, сперва производится их упорядочение в соответствии с заданными ключами сортировки, и лишь затем они обрабатываются в полученном порядке. При использовании в xsl:for-each элементы xsl:sort должны ставиться в начале. Если обрабатывается шаблон из xsl:apply-templates и xsl:for- each, то в качестве текущего набора узлов берется полный отсортированный список обрабатываемых узлов.
xsl:sort имеет атрибут select, значением которого является выражение. Указанное выражение вычисляется для каждого узла, подлежащего обработке. При этом данный узел используется в качестве текущего узла, а полный неупорядоченный список узлов, подлежащих обработке, выступает в роли текущего набора узлов. Полученный после вычисления объект преобразуется в строку как при вызове функции string. Данная строка используется как ключ сортировки для этого узла. По умолчанию атрибут select имеет значение, которое приводит к тому, что в качестве ключа сортировки используется строковое значение текущего узла.
Полученная строка используется как ключ сортировки для данного узла. Ниже приведены необязательные атрибуты элемента xsl:sort, управляющие упорядочением списка