Элемент xsl:if

Элемент 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.