</xsl:if>
<xsl:if test='age < 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
(сущности >
и <
обозначают символы '<
', и '>
') определяют условия: содержимое первого элемента xsl:if
будет выполняться, только если значение элемента age
было не меньше 21
; содержимое второго — только если значение age
было строго меньше 21
. Этот же самый шаблон может быть переписан с использованием элементов xsl:choose
, xsl:when
и xsl:otherwise
.
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match='person'>
<xsl:choose>
<xsl:when test='age >= 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
использовалось для генерации символьных данных. Между тем, выражения вполне пригодны и для того, чтобы создавать в выходящем документе целые фрагменты:
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match='person'>
<xsl:choose>
<xsl:when test='age >= 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>
<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>