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

на главную - закладки

Жанры

Технология XSLT

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

Шрифт:

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>

Листинг 3.15.
Результат

<result>

Integers:

123

Reals:

123.5

Reals minus integers:

0.5

</result>

Таблица преобразования типов

Для удобства использования все взаимные преобразования типов сведены в одну таблицу (табл. 3.2).

Таблица 3.2. Взаимные преобразования типов данных XSLT

Преобразовываемый тип
Целевой тип
boolean
(булевое значение)
number
(число)
string
(строка)
node-set
(множество узлов)
tree
(дерево)
boolean
(булевое значение)
 false NaN 
→ 
false
другое → 
true
пустая → 
false
непустая → 
true
пустое → 
false
другое → 
true
всегда
true
number
(число)
false
0 true
1
разбирается, как число в десятичном формате мн-во → строка → число дерево → строка → число
string
(строка)
false 
→ 
"false" true 
→ 
"true"
десятичная запись числа строковое значение первого узла в порядке просмотра строковое сложение всех текстовых узлов дерева
node-set
(множество узлов)
нет нет нет нет
tree
(дерево)
нет нет нет нет

Переменные

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

<xsl:variable name="url" select="'http://www.xsltdev.ru'"/>

создаст переменную с именем

url
и присвоит ей строковое значение
"http://www.xsltdev.ru"
. После этого переменную можно использовать в выражениях, например:

Поделиться:
Популярные книги

Морской волк. 1-я Трилогия

Савин Владислав
1. Морской волк
Фантастика:
альтернативная история
8.71
рейтинг книги
Морской волк. 1-я Трилогия

Гримуар темного лорда VII

Грехов Тимофей
7. Гримуар темного лорда
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда VII

Воронцов. Перезагрузка

Тарасов Ник
1. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фантастика: прочее
5.00
рейтинг книги
Воронцов. Перезагрузка

Кукловод

Злобин Михаил
2. О чем молчат могилы
Фантастика:
боевая фантастика
8.50
рейтинг книги
Кукловод

Он тебя не любит(?)

Тоцка Тала
Любовные романы:
современные любовные романы
7.46
рейтинг книги
Он тебя не любит(?)

Некурящий. Трилогия

Федотов Антон Сергеевич
Некурящий
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Некурящий. Трилогия

Законы Рода. Том 8

Андрей Мельник
8. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 8

Последний реанорец. Том I и Том II

Павлов Вел
1. Высшая Речь
Фантастика:
фэнтези
7.62
рейтинг книги
Последний реанорец. Том I и Том II

Сумеречный стрелок

Карелин Сергей Витальевич
1. Сумеречный стрелок
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сумеречный стрелок

На границе империй. Том 7. Часть 2

INDIGO
8. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
6.13
рейтинг книги
На границе империй. Том 7. Часть 2

Я — Легион

Злобин Михаил
3. О чем молчат могилы
Фантастика:
боевая фантастика
7.88
рейтинг книги
Я — Легион

Законы рода

Андрей Мельник
1. Граф Берестьев
Фантастика:
фэнтези
боевая фантастика
аниме
5.00
рейтинг книги
Законы рода

Кодекс Охотника XXXI

Винокуров Юрий
31. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника XXXI

Идеальный мир для Демонолога

Сапфир Олег
1. Демонолог
Фантастика:
юмористическое фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Демонолога