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

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

Жанры

Технология XSLT

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

Шрифт:

$nodeset1 | $nodeset2

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

Следует сказать, что, поскольку никакой тип данных не может быть преобразован во множество узлов, операнды объединения сами всегда должны быть множествами. То есть, выражение вида:

'а' | body/a

не добавит текстовый узел "

а
" к множеству элементов
а
, принадлежащих элементу
body
— оно просто будет некорректным.

Арифметические

операции

Четыре основные бинарные операции — "

+
", "
", "
div
", "
mod
" и пятая, унарная операция отрицания "
" обеспечивают в XSLT основные арифметические действия. Поскольку любой из типов данных может быть преобразован в численный тип, в качестве операндов арифметических операций можно использовать что угодно — например, вычитать из строки булевое выражение:

'0.5' - true
– 0.5

Следует осторожно обращаться со знаком "

". Имена элементов и атрибутов могут включать этот знак и поэтому выражение
first-last
будет воспринято не как разность значений элементов
first
и
last
, а как путь выборки элементов с именами "
first-last
". Для того чтобы избежать таких казусов, операторы всегда следует выделять пробелами:

first - last

Операции сравнения

В XSLT имеются следующие шесть операторов сравнения:

□ "

=
" — равно;

□ "

!=
" — не равно;

□ "

<
" меньше;

□ "

>
" больше;

□ "

<=
" меньше или равно (не больше);

□ "

>=
" больше или равно (не меньше).

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

Операции сравнения определяются в спецификации в три этапа:

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

□ затем для простых типов данных определяются равенство ("

=
") и неравенство ("
!=
");

□ наконец, для простых типов данных определяются сравнения "

<
", "
<=
", "
>
", "
>=
".

Сравнение, хотя бы один из операндов которого является множеством узлов, определяется следующим образом:

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

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

□ если один из операндов является множеством узлов, а второй имеет численный тип, сравнение будет истинным тогда и только тогда, когда во множестве узлов найдется такой узел, что сравнение текстового значения этого узла, преобразованного к числу, и самого численного операнда будет истинным;

□ если один из операндов является множеством узлов, а второй имеет строковый тип, сравнение будет истинным тогда и только тогда, когда во множестве узлов найдется такой узел, что сравнение его текстового значения и самого строкового операнда будет истинным;

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

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

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

<values>

 <string>0.5</string>

 <string>50%</string>

 <string>1/2</string>

 <number>0.5</number>

 <number>1.0</number>

 <number>1.5</number>

</values>

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

/values/string = true
true

В этом равенстве множество узлов сравнивается с булевым значением "истины". Множество узлов, выбираемое путем

/values/string
, приводится к булевому типу. Результатом приведения будет "истина", поскольку множество элементов string, принадлежащих элементу
values
, непусто. Таким образом, сравнение является проверкой на равенство двух "истин" — и результат, естественно, тоже будет "истиной".

/values/string != boolean(/values/boolean)
false

В этом случае мы проверяем множество узлов

/values/string
на неравенство булевому значению множества
/values/boolean
. Второй операнд является "истиной" (поскольку множество элементов
boolean
, принадлежащих элементу
values
, не пусто), а значит, все сравнение обратится в "ложь".

/values/string = boolean(/values/booleans)
false

В данном случае множество

/values/string
сравнивается с булевым значением множества
/values/booleans
, которое будет "ложью", поскольку это множество будет пустым. Таким образом, результат сравнения также будет "ложью".

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

Ваше Сиятельство 2

Моури Эрли
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Ваше Сиятельство 2

Вперед в прошлое 9

Ратманов Денис
9. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 9

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

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 6

Тайны затерянных звезд. Том 3

Лекс Эл
3. Тайны затерянных звезд
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Тайны затерянных звезд. Том 3

Тринадцатый IX

NikL
9. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Тринадцатый IX

Огненный наследник

Тарс Элиан
10. Десять Принцев Российской Империи
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Огненный наследник

Моя простая курортная жизнь 4

Блум М.
4. Моя простая курортная жизнь
Любовные романы:
эро литература
5.00
рейтинг книги
Моя простая курортная жизнь 4

Личный аптекарь императора

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

Тайные поручения

Билик Дмитрий Александрович
6. Бедовый
Фантастика:
юмористическое фэнтези
городское фэнтези
мистика
5.00
рейтинг книги
Тайные поручения

Страж Кодекса. Книга V

Романов Илья Николаевич
5. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Страж Кодекса. Книга V

Метатель. Книга 2

Тарасов Ник
2. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель. Книга 2

Оживший камень

Кас Маркус
1. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Оживший камень

Имперец. Том 3

Романов Михаил Яковлевич
2. Имперец
Фантастика:
боевая фантастика
попаданцы
альтернативная история
7.43
рейтинг книги
Имперец. Том 3

Сын Петра. Том 1. Бесенок

Ланцов Михаил Алексеевич
1. Сын Петра
Фантастика:
попаданцы
альтернативная история
6.80
рейтинг книги
Сын Петра. Том 1. Бесенок