Книга: Технология XSLT
Арифметические операции
Арифметические операции
Арифметические операции XPath сведены в табл. 6.3.
Таблица 6.3. Арифметические операции в XPath-выражениях
Операция | Синтаксис |
---|---|
Сложение | A + B |
Вычитание | A - B |
Умножение | A * B |
Деление | A div B |
Остаток деления | A mod B |
Унарное отрицание | - A |
Если операнды, значения, участвующие в операции, не являются числами, они сначала приводятся к этому типу, а уж затем производится операция. Например, можно легко перемножать литералы:
'2' * '2'
? 4
Арифметические действия в XPath работают, что называется, "как обычно", то есть совершенно стандартным образом. Арифметика XPath основывается на стандарте IEEE 754, который был использован и в других распространенных языках программирования, например в Java. Пожалуй, следует лишь обратить внимание на операторы деления, поскольку в разных языках они означают разные действия и потому легко запутаться.
Оператор div
делит свой первый операнд на второй. Это не целочисленное деление, как в некоторых других языках, div
осуществляет деление чисел с плавающей точкой. Оператор div
аналогичен оператору деления "/
" в таких языках, как Java, С++ и Pascal.
Примеры:
3.2 div 2.5
? 1.28
?
3.2 div -2.5 -1.28
?
-3.2 div -2.5 1.28
Оператор mod
возвращает остаток деления первого своего оператора на второй. Поскольку в разных языках остаток деления вычисляется по-разному, легче всего будет пояснить его функционирование в XPath на примере:
3.2 mod 2
? 1.2
?
3.2 mod -2 1.2
?
-3.2 mod 2 -1.2
?
-3.2 mod -2 -1.2
Оператор mod аналогичен оператору "%
" в таких языках, как Java и ECMAScript.
Результат остатка от деления имеет тот же знак, что и делимое. Этот факт можно использовать для того, чтобы выполнять деление без остатка, например число A
можно нацело разделить на число B выражением (A - (A mod B)) div B
.
Пример:
(3.2 - (3.2 mod 2)) div 2
? 1
Во избежание ошибок следует аккуратно использовать знак вычитания в арифметических операциях. Дело в том, что синтаксис XML разрешает использовать символ "-
" в именах элементов, которые в свою очередь также могут быть использованы в выражениях в составе путей выборки. Например, A - B
означает разность A
и B, в то время как A-B
будет воспринято, как имя 'A-B
'. Поэтому рекомендуется выделять знак минуса пробелами.
Приведем продукции выражений с арифметическими операциями.
Унарному отрицанию соответствует продукция UnaryExpr
. Как можно видеть, в текущей версии языка это — единственная унарная операция (то есть операция одного элемента).
[XP27] UnaryExpr ::= UnionExpr | '-' UnaryExpr
Попробуем упростить это правило, раскрыв рекурсию
UnaryExpr ::= '-' * UnionExpr
Таким образом, унарное отрицание можно повторять несколько раз:
------5
? 5
Умножению, делению и вычислению остатка деления соответствует одна продукция MultiplicativeExpr
:
[XP26] MultiplicativeExpr ::= UnaryExpr
| MultiplicativeExpr MultiplyOperator UnaryExpr
| MultiplicativeExpr 'div' UnaryExpr
| MultiplicativeExpr 'mod' UnaryExpr
Оператор умножения вынесен в отдельное правило:
[XP34] MultiplyOperator ::= '*'
Сложению и вычитанию соответствует правило AdditiveExpr
:
[XP25] AdditiveExpr ::= MultiplicativeExpr
| AdditiveExpr '+' MultiplicativeExpr
| AdditiveExpr '-' MultiplicativeExpr
- Арифметические операторы
- 2.2. Арифметические операции над числами, представленными в различных системах счисления
- А6.5. Арифметические преобразования
- ПРИЛОЖЕНИЕ В. ОПЕРАЦИИ ЯЗЫКА СИ
- 3.1.3. Арифметические операции в JavaScript
- I. Арифметические операции
- Пример 8-2. Арифметические операции
- Пример 11-8. Команда let, арифметические операции.
- 2.2.3 Арифметические операции