Чтение онлайн

ЖАНРЫ

Технология XSLT

Валиков Алексей Н.

Шрифт:
Листинг 7.22. Выходящий документ

Value-of boolean:false

Copy-of boolean:false

Value-of string:text

Copy-of string:text

Value-of number:3.14

Copy-of number:3.14

Value-of node-set:10

Copy-of node-set:<item>10</item><item>20</item><item>30</item>

Value-of tree:

text

text

Copy-of tree:<root>

text

<branch>

text

<leaf/>

<leaf/>

</branch>

<leaf/>

 </root>

Условная

обработка

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

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

Элемент xsl:if

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

<xsl:if

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

 <!-- Содержимое: шаблон -->

</xsl:if>

Элемент

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

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

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

<xsl:if test="a < b"/>

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

<xsl:if test="a &lt; b"/>

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

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

Пример

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

<list active="Bravo">

 <item>Alpha</item>

 <item>Bravo</item>

 <item>Charlie</item>

</list>

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

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

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

<xsl:template match="item">

 <option>

<!--

| Если текстовое значение элемента равно

| значению атрибута active его родительского элемента

+-->

<xsl:if test=". = ../@active">

<!-- To выводим атрибут selected -->

<xsl:attribute name="selected">selected</xsl:attribute>

</xsl:if>

<xsl:value-of select="."/>

 </option>

</xsl:template>

Результат:

<option>Alpha</option>

<option selected>Bravo</option>

<option>Charlie</option>

Примечание

В

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

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

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

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

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

<xsl:choose>

 <!--

| Содержимое: один или более элемент xsl:when, опциональный

| элемент xsl:otherwise

+-->

</xsl:choose>

<xsl:when

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

 <!-- Содержимое: шаблон -->

</xsl:when>

<xsl:otherwise>

 <!-- Содержимое: шаблон -->

</xsl:otherwise>

Элемент

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 может быть определено следующим образом:

<xsl:choose>

 <xsl:when test="условиеА">

шаблонB

 </xsl:when>

 <xsl:otherwise>

шаблонC

Поделиться с друзьями: