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

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

Жанры

Технология XSLT

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

Шрифт:

Таблица 6.4. Операторы сравнения

Оператор Значение
=
Равно
!=
Не равно
<
Меньше
>
Больше
<=
Меньше
или равно (не больше)
>=
Больше или равно (не меньше)

XPath-выражения чаще всего используются в значениях атрибутов, символ "

<
" в которых в соответствии с синтаксисом XML использовать нельзя. Поэтому операторы сравнения "меньше" ("
<
") и "не больше" ("
<=
") нужно записывать с использованием сущностей. Оператор "меньше" может быть записан как "
&lt
;", а оператор "не больше" как "
&lt;=
".

Пример

Результатом обработки элемента

<xsl:value-of select="1&lt;2"/>

будет строка "

true
".

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

В XPath вполне корректным будет выражение вида

A > B > C
. Однако результат его будет довольно неожиданным. В XPath действует правило левой ассоциативности операторов сравнения, поэтому
A > B > C
будет равносильно
(А > B) > C
. То есть
A
будет сравнено с
B
, затем результат, истина или ложь, будет преобразован в числовой тип (получится
1
или
0
) и затем сравнен со значением
C
.

Пример:

3 > 2 > 1
(3 > 2) > 1
1 > 1
false

3 > 2 > 0
(3 > 2) > 0
1 > 0
true

Неравенствам в XPath соответствует продукция

RelationalExpr
:

[XP24] RelationalExpr ::= AdditiveExpr

| RelationalExpr '<' AdditiveExpr

| RelationalExpr '>' AdditiveExpr

| RelationalExpr '<=' AdditiveExpr

| RelationalExpr '>=' AdditiveExpr

Операции "равно" и "не равно" записываются при помощи продукции

EqualityExpr:

[XP23] EqualityExpr ::= RelationalExpr

| EqualityExpr '=' RelationalExpr

| EqualityExpr '!=' RelationalExpr

Операции

с множествами узлов

Три основные операции с множествами узлов, которые поддерживает язык XPath, — это фильтрация множества, выборка с использованием путей и объединение.

Фильтрация

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

В выражениях множества узлов могут также фильтроваться одним или несколькими предикатами. Узел остается в фильтруемом множестве, только если он удовлетворяет всем предикатам поочередно.

Пример

Предположим, что нам нужно оставить в фильтруемом множестве узлов, которое присвоено переменной

nodes
, только те узлы, которые имеют имя
а
и атрибут
href
. Искомое выражение может быть записано следующим образом:

$nodes[self::а][@href]

Можно использовать и более сложные конструкции, например, фильтровать объединение двух множеств — присвоенного переменной

nodes
и возвращаемого путем выборки
body/*
:

($nodes|body/*)[self::a][@href]

Выражение, в котором производится фильтрация узлов, отвечает EBNF-правилу

FilterExpr
:

[XP20] FilterExpr ::= PrimaryExpr | FilterExpr Predicate

Если раскрыть рекурсию, которая имеется в этом правиле, его можно переписать в более простом виде:

FilterExpr ::= PrimaryExpr Predicate*

Выражение

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

Использование в выражениях путей выборки

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

$nodes/*

Для разделения шагов выборки в фильтрующих выражениях можно использовать операторы "

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

$nodes//node

Здесь

node
— это тест узла, выполняющийся для всех типов узлов, а
//
, как и обычно, сокращение от
/descendant-or-self:node/
.

Выражения, которые используют пути выборки, соответствуют продукции

PathExpr
:

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

Девочка-лед

Джолос Анна
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Девочка-лед

Держать удар

Иванов Дмитрий
11. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Держать удар

Возвышение Меркурия. Книга 4

Кронос Александр
4. Меркурий
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Возвышение Меркурия. Книга 4

Предатель. Цена ошибки

Кучер Ая
Измена
Любовные романы:
современные любовные романы
5.75
рейтинг книги
Предатель. Цена ошибки

Брак по принуждению

Кроу Лана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Брак по принуждению

Стеллар. Заклинатель

Прокофьев Роман Юрьевич
3. Стеллар
Фантастика:
боевая фантастика
8.40
рейтинг книги
Стеллар. Заклинатель

Вернуть невесту. Ловушка для попаданки 2

Ардова Алиса
2. Вернуть невесту
Любовные романы:
любовно-фантастические романы
7.88
рейтинг книги
Вернуть невесту. Ловушка для попаданки 2

Мое ускорение

Иванов Дмитрий
5. Девяностые
Фантастика:
попаданцы
альтернативная история
6.33
рейтинг книги
Мое ускорение

Чужая дочь

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Чужая дочь

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

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

Неудержимый. Книга XII

Боярский Андрей
12. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XII

Попаданка в Измену или замуж за дракона

Жарова Анита
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Попаданка в Измену или замуж за дракона

Измена. Верни мне мою жизнь

Томченко Анна
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Верни мне мою жизнь

Титан империи

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