</xsl:if>

  <xsl:if test='age &lt; 21'>

   <xsl:text>Sorry, </xsl:text>

   <xsl:value-of select='name'/>

   <xsl:text>, access denied.</xsl:text>

  </xsl:if>

 </xsl:template>

</xsl:stylesheet>

Выделенные выражения age >= 21 и age < 21 (сущности &gt; и &lt; обозначают символы '<', и '>') определяют условия: содержимое первого элемента xsl:if будет выполняться, только если значение элемента age было не меньше 21; содержимое второго — только если значение age было строго меньше 21. Этот же самый шаблон может быть переписан с использованием элементов xsl:choose, xsl:when и xsl:otherwise.

Листинг 3.19

<xsl:stylesheet

 version='1.0'

 xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

 <xsl:template match='person'>

  <xsl:choose>

   <xsl:when test='age &gt;= 21'>

    <xsl:text>Welcome, </xsl:text>

    <xsl:value-of select='name'/>

    <xsl:text>.</xsl:text>

   </xsl:when>

   <xsl:otherwise>

    <xsl:text>Sorry, </xsl:text>

    <xsl:value-of select='name'/>

    <xsl:text>, access denied.</xsl:text>

   </xsl:otherwise>

  </xsl:choose>

 </xsl:template>

</xsl:stylesheet>

Результатом этого преобразования будет текст

Sorry, Johnny, access denied.

В этой строке имя johnny было заимствовано из входящего документа. Оно было создано элементом xsl:value-of:

<xsl:value-of select='name'/>

Этот элемент вычислил значение выражения name, которое было указано в его атрибуте select, преобразовал результат вычисления в строку и создал в выходящем документе текстовый узел, содержащий вычисленное значение.

В данном случае выражение name использовалось для генерации символьных данных. Между тем, выражения вполне пригодны и для того, чтобы создавать в выходящем документе целые фрагменты:

Листинг 3.20. Преобразование

<xsl:stylesheet

 version='1.0'

 xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>

 <xsl:template match='person'>

  <xsl:choose>

   <xsl:when test='age &gt;= 21'>

    <event type='access granted'>

     <xsl:copy-of select='name'/>

    </event>

   </xsl:when>

   <xsl:otherwise>

    <event type='access denied'>

     <xsl:copy-of select='name'/>

     <reason type='underaged'>

      <xsl:copy-of select='age'/>

     </reason>

    </event>

   </xsl:otherwise>

  </xsl:choose>

 </xsl:template>

</xsl:stylesheet>

Листинг 3.21. Выходящий документ

<event type='access denied'>

 <name>John</name>

 <reason type='underaged'>

  <age>19</age>

 </reason>

</event>

Элемент xsl:copy-of, который использовался в этом преобразовании, делает примерно то же самое, что и xsl:value-of — вычисляет значение выражения и включает его в дерево выходящего документа. Главным отличием xsl:copy-of является то, что при его выполнении вычисленное выражение не преобразуется в строку, что позволяет копировать в выходящее дерево множества узлов и результирующие фрагменты. В приведенном выше примере элементы name и age выходящего документа являются копиями элементов name и age входящего документа.

В преобразованиях выражения могут использоваться только в атрибутах элементов и никогда — в тексте самого преобразования. Элемент

<reason type='underaged'>

 age

</reason>

будет скопирован в выходящий документ, содержащий текст 'age'. Ни о каком вычислении выражения age речь, конечно же, не идет. Для того чтобы в результирующий документ был скопирован результат вычисления выражения, оно должно быть заключено в атрибут одного из вычисляющих элементов, например, xsl:copy-of:

<reason type='underaged'>

 <xsl:copy-of select='age'/>

</reason>

Вы читаете Технология XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату