Валиков Алексей Н.
Шрифт:
Листинг 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 < 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, опциональный