Технология XSLT — страница 31 из 66

В XSLT имеются две инструкции, которые поддерживают условную обработку —

xsl:if
и
xsl:choose
. Инструкция
xsl:if
позволяет создавать простые условия типа "если-то", в то время как
xsl:choose
создает более сложную конструкцию для выбора одной из нескольких имеющихся возможностей в зависимости от выполнения тех или иных условий.

Элемент xsl:if

Синтаксис элемента следующий:

test="выражение">

Элемент

xsl:if
является простейшим условным оператором в XSLT. Выражение, содержащееся в обязательном атрибуте
test
, вычисляется и приводится к булевому типу. В том и только том случае, если выражение имеет значение
true
, процессор выполняет шаблон, содержащийся в
xsl:if
.

Вследствие того, что атрибуты в XML не могут содержать некоторые специальные символы (такие как "

<
" и "
&
"), их необходимо заменять символьными сущностями. В особенности это касается сравнения чисел типа "меньше"; объявление вида

будет с точки зрения синтаксиса XML некорректным. Вместо него следует использовать эквивалентное объявление

Следует заметить, что символ "больше" ("

>
") заменять сущностью необязательно. Однако из соображений единообразия принято заменять и его.

Пример

Предположим, мы преобразовываем список названий

Alpha

Bravo

Charlie

во фрагмент HTML-кода, в котором каждый элемент

item
должен быть преобразован в соответствующий элемент
option
, а значение, выбранное во входящем документе атрибутом
active
элемента
list
, должно быть помечено булевым атрибутом
selected
.

Листинг 7.23. Шаблон преобразования, использующий элемент xsl:if

selected

Результат:

Примечание

В данном преобразовании использовался метод вывода "

html
". Подробнее о методах вывода выходящего документа см. раздел "Контроль вывода документа" 8 главы.

К сожалению, элемент

xsl:if
в XSLT не может реализовать конструкцию if-then-else (англ. если-то-иначе). Условные выражения такого вида реализуются при помощи элементов
xsl:choose
,
xsl:when
и
xsl:otherwise
.

Элементы xsl:choose, xsl:when, xsl:otherwise

Ниже даны синтаксические конструкции этих элементов:


test="выражение">


Элемент

xsl:choose
содержит один или несколько элементов
xsl:when
и необязательный элемент
xsl:otherwise
. При обработке
xsl:choose
процессор поочередно вычисляет выражения, содержащиеся в атрибутах
test
элементов
xsl:when
, приводит их к булевому типу и выполняет содержимое первого (и только первого) элемента, тестовое выражение которого будет равно
true
. В случае если ни одно из тестовых выражений не обратилось в "истину" и в
xsl:choose
присутствует
xsl:otherwise
, процессор выполнит содержимое этого элемента.

Элементы

xsl:choose
,
xsl:when
и
xsl:otherwise
можно совместно использовать для получения конструкции типа if-then-else. Условие вида "если выражение
A
истинно, то выполнить действие
B
иначе выполнить действие
C
", которое в других языках программирования может быть записано, к примеру, как

если

 верно условиеА

то

 выполнить шаблонB

иначе

 выполнить шаблонC

в XSLT может быть определено следующим образом:

  шаблонB

  шаблонC

Вместе с тем, условие вида "если — то — иначе" это не все, на что способен элемент

xsl:choose
. Возможность указывать несколько элементов
xsl:when
позволяет записывать более сложные условия выбора вида:

если

 верно условие1

то

 выполнить шаблон1

иначе если

 верно условие2

то

 выполнить шаблон2

 ...

иначе если

 верно условиеN

то

 выполнить шаблонN

иначе

 выполнить шаблонМ

Такой множественный условный переход совершенно прозрачно оформляется в виде следующей

xsl:choose
-конструкции:

  шаблон1

  шаблон2

  шаблонN

  шаблонМ

Циклическая обработка