Сложению и вычитанию соответствует правило AdditiveExpr:
[XP25] AdditiveExpr ::= MultiplicativeExpr
| AdditiveExpr '+' MultiplicativeExpr
| AdditiveExpr '-' MultiplicativeExpr
Операции сравнения
XPath позволяет сравнивать числа при помощи операторов, перечисленных в табл. 6.4.
| Оператор | Значение |
|---|---|
= | Равно |
!= | Не равно |
< | Меньше |
> | Больше |
<= | Меньше или равно (не больше) |
>= | Больше или равно (не меньше) |
XPath-выражения чаще всего используются в значениях атрибутов, символ '<' в которых в соответствии с синтаксисом XML использовать нельзя. Поэтому операторы сравнения 'меньше' ('<') и 'не больше' ('<=') нужно записывать с использованием сущностей. Оператор 'меньше' может быть записан как '<', а оператор 'не больше' как '<='.
Результатом обработки элемента
<xsl:value-of select='1<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]
