<href>
<location>http://www.xsltdev.ru</location>
</href>
то получим следующий результат:
<B>You may visit the <A HREF='http://www.xsltdev.ru'>following link</A>.</B>
В терминах деревьев выполнение этого шаблона показано на рис. 3.17.
Рис. 3.17. Часть дерева входящего документа и часть дерева сгенерированного документа
Поскольку XSLT оперирует документами, представленными в виде деревьев, уместнее будет сказать, что на самом деле шаблоны обрабатывают фрагменты входящего дерева и создают фрагменты исходящего. Последним и соответствует тип данных, который в XSLT называют
Структурно результирующий фрагмент дерева тоже является деревом — это просто отрезанная ветка. Шаблоны генерируют ветки, используя собственные инструкции, а также результаты выполнения шаблонов, которые они вызывают и в итоге множество веток срастается в одно большое дерево, которое и является целью преобразования.
Между тем, результирующие фрагменты деревьев могут и не попасть в само результирующее дерево, то есть совершенно не факт, что они всегда будут его частями. Например, результирующий фрагмент дерева может быть присвоен переменной как начальное значение. Это предоставляет следующие, очень интересные возможности.
□ Переменная может содержать дерево, являющееся результатом обработки документа. К сожалению, в чистом XSLT нельзя повторно обрабатывать части документов, однако, это реализуется при помощи механизма расширений.
□ Дерево может быть определено один раз в виде значения переменной и использовано несколько раз в выходящем документе.
<href>
<location>http://www.xsltdev.ru</location>
</href>
<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='{location}'>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>
<result>
Result as string:
You may visit the following link.
Result as tree:
<body><B>You may visit the <A HREF='http://www.xsltdev.ru'>following
link</A>.</B>
</body>
</result>
Это преобразование легко понять, если обратиться к рис. 3.18.
Рис. 3.18. Генерация выходящего дерева с использованием переменных
Переменной href
присваивается дерево, содержащее результат обработки элемента href
, находящегося в корне входящего документа. Затем переменная href
дважды используется в результирующем документе: один раз как строка, принадлежащая текстовому узлу, и один раз как результирующий фрагмент дерева.
Дерево может быть преобразовано в булевое значение, число или строку. Некоторые процессоры позволяют также преобразовывать дерево во множество узлов, которое содержит единственный элемент — корневой узел этого дерева. Такие возможности бывают весьма полезными, но не являются, к сожалению, стандартными в текущей версии языка.
При преобразовании результирующего фрагмента дерева в булевое значение результатом всегда будет true, поскольку дерево никогда не бывает 'пустым' — в нем всегда присутствует корневой узел.
При преобразовании дерева в строку результатом является конкатенация (строковое сложение) всех текстовых узлов дерева в порядке просмотра.
Результирующий фрагмент дерева
<body>
<B>You may visit the <A HREF='http://www.xsltdev.ru'>following
link</A>.</B>
</body>
приводится к строке
The result is: You may visit the following link.
При приведении дерева к числу, оно сначала преобразовывается в строку, а затем в число. Это означает, что деревья, в принципе, можно использовать в арифметических операциях, несмотря на то, что они для этого не предназначены.
<numbers>