Пример
Предположим, мы преобразовываем список названий
Alpha
Bravo
Charlie
во фрагмент HTML-кода, в котором каждый элемент item
должен быть преобразован в соответствующий элемент option
, а значение, выбранное во входящем документе атрибутом active
элемента list
, должно быть помечено булевым атрибутом selected
.
Листинг 7.23. Шаблон преобразования, использующий элемент xsl:if
selected
Результат:
Alpha Bravo Charlie
Примечание
В данном преобразовании использовался метод вывода " 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
шаблонМ
Конструкция этого элемента такова:
select=" выражение ">
Элемент xsl:for-each
используется для создания в выходящем документе повторяемых частей структуры. Обязательный атрибут select
указывает выражение, результатом вычисления которого должно быть множество узлов. Шаблон, содержащийся в xsl:for-each
, будет выполнен процессором для каждого узла этого множества.
Пример
Мы можем использовать xsl:for-each
для того, чтобы создать список гипертекстовых ссылок для документа вида.
Листинг 7.24. Входящий документ
Please visit this link.
Or this one.
Or visit this site.
Or click here.
Будем считать, что в этом документе элементы гипертекстовых ссылок а являются потомками элемента body
, который находится в элементе html
.
Листинг 7.25. Шаблон преобразования
Листинг 7.26. Результат преобразования
http://www.aaa.com
http://www.bbb.com
http://www.ccc.com
http://www.ddd.com
Элемент xsl:for-each
изменяет контекст преобразования. Множество узлов, возвращаемое выражением в атрибуте select
, становится текущим множеством узлов, а узел, шаблон для которого выполняется в данный момент, становится текущим узлом.
Как мы знаем, множества узлов в XSLT не имеют внутреннего порядка. Однако, обработка узлов в xsl:for-each
будет происходить в так называемом порядке просмотра документа, который зависит от того, какое выражение использовалось для вычисления обрабатываемого множества. Порядок обработки множества узлов в xsl:for-each
может быть также изменен элементами xsl:sort
, которые могут присутствовать в xsl:for-each
. Элемент xsl:sort
задает сортировку обрабатываемого множества узлов, изменяя, таким образом, порядок просмотра, что часто бывает очень полезно.
Читать дальше