Чтение онлайн

ЖАНРЫ

Технология XSLT

Валиков Алексей Н.

Шрифт:

□ Переменная может содержать дерево, являющееся результатом обработки документа. К сожалению, в чистом 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>&#xA;Result as string:&#xA;</xsl:text>

<xsl:value-of select="$href"/>

<xsl:text>&#xA;Result as tree:&#xA;</xsl:text>

<xsl:copy-of select="$href"/>

<xsl:text>&#xA;</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.

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

Пример
Листинг 3.13. Входящий документ:

<numbers>

 <integer>1</integer>

 <real>1</real>

 <integer>2</integer>

 <real>2</real>

 <integer>3</integer>

 <real>3.5</real>

</numbers>

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

<xsl:stylesheet

 version="1.0"

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

 <xsl:variable name="integers">

<integers><xsl:copy-of select="/numbers/integer"/></integers>

 </xsl:variable>

 <xsl:variable name="reals">

<reals><xsl:copy-of select="/numbers/real"/></reals>

 </xsl:variable>

 <xsl:template match="/">

<result>

<xsl:text>&#xA; Integers:&#xA;</xsl:text>

<xsl:value-of select="$integers"/>

<xsl:text>&#xA;Reals:&#xA;</xsl:text>

<xsl:value-of select="$reals"/>

<xsl:text>&#xA;Reals minus integers:&#xA;</xsl:text>

<xsl:value-of select="$reals - $integers"/>

<xsl:text>&#xA;</xsl:text>

</result>

 </xsl:template>

</xsl:stylesheet>

Поделиться с друзьями: