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

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

Жанры

Технология XSLT

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

Шрифт:
Примеры

'2' * '2'
4

'one' + 'two'
NaN

'2/3' + '5/6'
NaN

'2' div '3' + '5' div '6'
1.5

При работе с численными значениями можно использовать следующие операторы:

□ 

, унарный оператор, который выполняет отрицание своего единственного операнда — эта операция равносильна вычитанию числа из нуля;

□ 

+
, бинарный оператор сложения, возвращает сумму своих операндов;

□ 

,
бинарный оператор вычитания, возвращает разность своих операндов;

□ 

*
, бинарный оператор умножения, возвращает произведение своих операндов;

□ 

div
, бинарный оператор деления, возвращает частное от деления первого операнда на второй;

□ 

mod
, бинарный оператор, возвращающий остаток от деления первого операнда на второй.

Обратим внимание на то, что оператор

div
в отличие от его трактовки в языке Pascal, выполняет нецелое деление. Результатом вычисления выражения
3 div 2
будет
1.5
, а не
1
.

Динамическая типизация в XSLT позволяет использовать в выражениях значения разных типов — например, складывать строки и булевые значения или производить логические операции над числами. В тех случаях, когда тип данных значения отличается от типа данных, который требуется для операции, значения будут неявным образом приведены к требуемому типу, если это, конечно, возможно.

Множество узлов (node-set)

Несмотря на то, что XSLT оперирует логической моделью XML-документа как деревом с узлами, в XSLT нет типа данных, который соответствовал бы одному узлу. Вместо этого используется гораздо более мощный и гибкий тип данных, называемый множеством узлов (англ. node-set).

Множество узлов — это чистое математическое множество, состоящее из узлов дерева: оно не содержит повторений и не имеет внутреннего порядка элементов. Множества узлов выбираются особым видом XPath-выражений, которые называются путями выборки (англ. location path).

Пример
Листинг 3.1. Документ

<А>

 <В/>

 <С>

<D>

<G/>

</D>

<E/>

<F>

<H/>

<I/>

</F>

 </C>

</A>

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

C
, который находился бы в элементе
A
, который находится в корне документа. Соответствующее XPath-выражение будет записано в виде
/A/C//node
.

Для наглядности представим наш документ в виде дерева (рис. 3.12) и выделим в нем соответствующее множество узлов.

Рис. 3.12. Выбор множества узлов

Выбранное множество состоит из узлов элементов

D
,
G
,
E
,
F
,
H
, I (рис. 3.13):

Рис. 3.13. Выбранное множество

Выбор

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

В общем случае, во множество узлов не входят дети узлов, содержащихся в нем. В нашем примере узлы элементов

G
,
H
и
I
вошли в выбранное множество только потому, что они соответствовали пути выборки
/A/C//node
. Если бы путь выборки имел вид
/A/C/node
(то есть, выбрать всех детей узла
C
, содержащегося в узле
A
, находящемся в корне документа), результат (рис. 3.14) был бы иным.

Рис. 3.14. Другой путь выборки

Выбранное множество узлов имело бы вид (рис. 3.15):

Рис. 3.15. Выбранное множество

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

/A
(выбрать узел
A
, находящийся в корне документа) было бы множество, состоящее из единственного узла (рис. 3.16).

Рис. 3.16. Множество, состоящее из единственного узла

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

xsl:apply-templates
и
xsl:for-each
) позволяют предварительно выполнять их сортировку при помощи элемента
xsl:sort
.

Множества узлов можно сравнивать при помощи операторов "

=
" (равно) и "
!=
" (не равно). В отличие от равенства математических множеств, равенство множеств узлов
A
и
B
в XSLT означает то, что найдется узел
a
, принадлежащий множеству
A
и узел
b
, принадлежащий множеству
B
такие, что их строковые значения будут равны. Неравенство множеств означает наличие в них как минимум пары узлов с различными строковыми представлениями. Такие определения делают возможным при сравнении двух множеств одновременное выполнение равенства и неравенства.

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

<numbers>

 <int>1</int>

 <byte>2</byte>

 <int>2</int>

 <byte>3</byte>

</numbers>

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

<xsl:stylesheet

 version="1.0"

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

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

Развод. Боль предательства

Верди Алиса
4. Измены
Любовные романы:
современные любовные романы
7.50
рейтинг книги
Развод. Боль предательства

Идеальный мир для Лекаря 23

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

Имя нам Легион. Том 11

Дорничев Дмитрий
11. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 11

Газлайтер. Том 14

Володин Григорий Григорьевич
14. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 14

Архил…? Книга 3

Кожевников Павел
3. Архил...?
Фантастика:
фэнтези
попаданцы
альтернативная история
7.00
рейтинг книги
Архил…? Книга 3

Королевская кровь-13. Часть 1

Котова Ирина Владимировна
14. Королевская кровь
Фантастика:
городское фэнтези
фэнтези
эпическая фантастика
5.00
рейтинг книги
Королевская кровь-13. Часть 1

Идеальный мир для Лекаря 13

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

Первый среди равных. Книга II

Бор Жорж
2. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга II

Имя нам Легион. Том 7

Дорничев Дмитрий
7. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 7

Война

Валериев Игорь
7. Ермак
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Война

Жена неверного генерала, или Попаданка на отборе

Удалова Юлия
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Жена неверного генерала, или Попаданка на отборе

Неправильный диверсант Забабашкин

Арх Максим
4. Неправильный солдат Забабашкин
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Неправильный диверсант Забабашкин

Барон Дубов 7

Карелин Сергей Витальевич
7. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов 7

Идеальный мир для Лекаря 3

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