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

ЖАНРЫ

Технология XSLT

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

Шрифт:

Для того чтобы корректно выполнить такое сравнение, можно использовать функцию

generate-id
, которая для каждого из узлов дерева генерирует уникальный строковый идентификатор, присущий только этому узлу и никакому другому, причем для одних и тех же узлов идентификаторы всегда будут генерироваться одинаковыми. Таким образом, для проверки тождественности двух узлов, содержащихся во множествах
$A
и
$B
, будет достаточно сравнить их уникальные идентификаторы:

generate-id($А) = generate-id($В)

Множества узлов могут быть

преобразованы в булевые значения, числа и строки.

При преобразовании в булевый тип пустое множество узлов преобразуется в

false
, а непустое — в
true
. Например, чтобы проверить, есть ли у текущего узла атрибут
value
, можно написать:

<xsl:if test="@value">

 <xsl:text>Value attribute exists here.</xsl:text>

</xsl:if>

Выражение

@value
возвратит непустое множество, состоящее из узла атрибута
value
, если он есть в текущем элементе, или пустое множество, если такого атрибута нет. В первом случае логическим эквивалентом будет
true
, во втором —
false
, то есть текст будет выведен только в случае наличия атрибута
value
.

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

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

<catalog>

 <item>A</item>

 <item>B</item>

 <item>C</item>

 <item>D</item>

</catalog>

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

<xsl:stylesheet

 version="1.0"

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

 <xsl:output method="text"/>

 <xsl:template match="/">

<xsl:value-of select="catalog/item"/>

 </xsl:template>

</xsl:stylesheet>

Результат:

A

При преобразовании множества узлов в число, множество сначала приводится к строке, а затем строка преобразуется в численное значение. Проще говоря, численным значением множества узлов будет численное значение первого узла в порядке просмотра документа.

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

<numbers>

 <integer>1</integer>

 <real>1.5</real>

 <integer>2</integer>

 <real>2.6</real>

 <integer>3</integer>

 <real>3.7</real>

</numbers>

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

<xsl:stylesheet

 version="1.0"

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

 <xsl:output method="text"/>

 <xsl:template match="/">

<xsl:value-of select="numbers/real — numbers/integer"/>

 </xsl:template>

</xsl:stylesheet>

Результат:

0.5

Результирующий фрагмент дерева (result tree fragment)

Четыре типа данных, описанных выше, заимствованы языком XSLT из XPath. Вместе с тем, XSLT имеет и свой собственный тип данных, называемый result tree fragment (результирующий фрагмент дерева).

Для того чтобы понять этот тип данных, обратимся к примеру шаблона:

<xsl:template match="href">

 <B>You may visit the <A href="#">following link</A>.</B>

</xsl:template>

Если мы применим это правило к части документа

<href>

 <location>http://www.xsltdev.ru</location>

</href>

то получим следующий результат:

<B>You may visit the <A href="#">following link</A>.</B>

В терминах деревьев выполнение этого шаблона показано на рис. 3.17.

Рис. 3.17. Часть дерева входящего документа и часть дерева сгенерированного документа

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

Структурно результирующий фрагмент дерева тоже является деревом — это просто отрезанная ветка. Шаблоны генерируют ветки, используя собственные инструкции, а также результаты выполнения шаблонов, которые они вызывают и в итоге множество веток срастается в одно большое дерево, которое и является целью преобразования.

Между тем, результирующие фрагменты деревьев могут и не попасть в само результирующее дерево, то есть совершенно не факт, что они всегда будут его частями. Например, результирующий фрагмент дерева может быть присвоен переменной как начальное значение. Это предоставляет следующие, очень интересные возможности.

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