□ Переменная может содержать дерево, являющееся результатом обработки документа. К сожалению, в чистом XSLT нельзя повторно обрабатывать части документов, однако, это реализуется при помощи механизма расширений.
□ Дерево может быть определено один раз в виде значения переменной и использовано несколько раз в выходящем документе.
Пример
Листинг 3.10. Входящий документ
<href>
<location>http://www.xsltdev.ru</location>
</href>
Листинг 3.11.
Преобразование
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="href">
<body>
<xsl:apply-templates select="href"/>
</body>
</xsl:variable>
<xsl:template match="href">
<B>You may visit the <A href="#">following link</A>.</B>
</xsl:template>
<xsl:template match="/">
<result>
<xsl:text>
Result as string:
</xsl:text>
<xsl:value-of select="$href"/>
<xsl:text>
Result as tree:
</xsl:text>
<xsl:copy-of select="$href"/>
<xsl:text>
</xsl:text>
</result>
</xsl:template>
</xsl:stylesheet>
Листинг 3.12. Выходящий документ
<result>
Result as string:
You may visit the following link.
Result as tree:
<body><B>You may visit the <A href="#">following
link</A>.</B>
</body>
</result>
Это преобразование легко понять, если обратиться к рис. 3.18.
Рис. 3.18. Генерация выходящего дерева с использованием переменных
Переменной
href
присваивается дерево, содержащее результат обработки элемента
href
, находящегося в корне входящего документа. Затем переменная
href
дважды используется в результирующем документе: один раз как строка, принадлежащая текстовому узлу, и один раз как результирующий фрагмент дерева.
Дерево может быть преобразовано в булевое значение, число или строку. Некоторые процессоры позволяют также преобразовывать дерево во множество узлов, которое содержит единственный элемент — корневой узел этого дерева. Такие возможности бывают весьма полезными, но не являются,
к сожалению, стандартными в текущей версии языка.
При преобразовании результирующего фрагмента дерева в булевое значение результатом всегда будет true, поскольку дерево никогда не бывает "пустым" — в нем всегда присутствует корневой узел.
При преобразовании дерева в строку результатом является конкатенация (строковое сложение) всех текстовых узлов дерева в порядке просмотра.
Пример
Результирующий фрагмент дерева
<body>
<B>You may visit the <A href="#">following
link</A>.</B>
</body>
приводится к строке
The result is: You may visit the following link.
При приведении дерева к числу, оно сначала преобразовывается в строку, а затем в число. Это означает, что деревья, в принципе, можно использовать в арифметических операциях, несмотря на то, что они для этого не предназначены.