То же самое множество узлов может считаться также и большим
1
, поскольку последний элемент этого множества имеет строковое значение "
1.5
", при приведении которого к числу мы получаем
1.5
, что больше
1
.
/values/number = 1
→
true
Второй элемент множества
/values/number
равен
1
, то есть и это сравнение будет истинным.
Примеры сравнения множества узлов со строковым значением:
/values/number = '1'
→
false
Множество
/values/number
не будет равно строке "
1
", поскольку ни один из узлов этого множества не имеет строкового значения "
1
".
/values/number = '1.0'
→
true
Множество
/values/number
будет считаться равным строке "
1.0
", поскольку второй узел этого множества имеет текстовое значение "
1.0
".
/values/number != '1.0'
→
true
Множество
/values/number
может также считаться не равным строке "
1.0
", поскольку первый узел этого множества имеет текстовое значение "
0.5
", не равное "
1.0
".
Примеры сравнения двух множеств узлов:
/values/number = /values/string
→
true
Для двух этих множеств будет выполняться равенство, поскольку оба они имеют по узлу с равными строковыми значениями — первый узел
/values/number
и первый узел
/values/string
равны "
0.5
".
values/number != /values/string
→
true
Для этих же множеств будет выполняться неравенство, поскольку в них найдется неравная пара узлов (например, узел с текстовым значением "
1.0
" в
/values/number
и узел с текстовым значением "
50%
" в
/values/string
).
Определим теперь равенство и неравенство значений простых типов. При проверке на равенство или неравенство оба операнда приводятся к общему типу и сравниваются. Приведение к общему типу производится следующим образом:
□ если хотя бы один из операндов имеет булевый тип, второй также приводится к булевому типу;
□ иначе, если хотя бы один из операндов — число, второй также приводится к численному типу;
□ иначе, если хотя бы один из операндов — строка, второй также приводится к строковому типу.
После того, как оба операнда приведены к некоторому общему типу, они проверяются на равенство или неравенства как два значения этого общего типа:
□ два булевых значения равны тогда и только тогда, когда они оба являются "истиной" или оба являются "ложью";
□ равенство численных значений понимается в обычном смысле (строгое определение равенства чисел дано в стандарте IEEE 754, но вряд ли оно представляет для нас большой интерес);
□ две строки равны тогда и только тогда, когда они представлены одинаковыми последовательностями Unicode-символов.
Два значения простых типов (то есть — булевого, численного или строкового типа) неравны тогда и только тогда, когда для них не выполняется равенство.
Примеры сравнения значений простых типов:
□
true = 1
→
true
При приведении числа
1
к булевому типу получается "истина", что и подтверждается
этим равенством.
□
true = 100
→
true
Результатом приведения числа
100
к булевому типу также является "истина".
□
false = 'false'
→
false
При приведении непустой строки "false" к булевому типу, получается "истина". Отсюда — неверность равенства.
□
.5 =0.5
→
true
.5
и
0.5
представляют одно и то же число, хоть и они записаны в разной форме.
□
.5 = '0.5'
→
true
Это равенство также будет верным, поскольку результатом преобразования строки "
0.5
" в число будет также
0.5
.
□
1 != 'two'
→
true
Результатом преобразования строки "
two
" в численный тип будет значение
NaN
, которое не равно
1
.
При сравнении с использованием операторов "
<
", "
<=
", "
>
" и "
>=
", оба операнда всегда приводятся к численному типу и сравниваются как числа.
Примеры сравнений с использованием операторов "
<
", "
<=
", "
>
" и "
>=
":
false > true
→
false
В численном виде
true
соответствует
1
, a
false
—
0
, то есть это сравнение равносильно сравнению
0 > 1
, результатом которого является "ложь".
'0' <= false
→
true
Это сравнение равносильно сравнению
0 <= 0
, результатом его будет "истина".
'1' >= '0'
→
true
Это сравнение равносильно сравнению
1 >= 0
, результатом его будет "истина".
Следует обратить внимание, на то, что символы "
<
" и "
>
" заменены сущностями
<
и
>
соответственно. В случае символа "
<
" такая замена необходима, чтобы не нарушать выражениями синтаксис XML-документа. Заменять символ "
>
" обязательной нужды нет, это делается исключительно из соображений единообразности.
Логические операции
В XSLT имеются две логические операции —
or
и
and
. Эти операции бинарны, то есть каждая из них определена для двух операндов. Если операнды не являются булевыми значениями, они неявным образом приводятся к булевому типу.
Семантика
or
и
and
очевидна — они соответствуют операциям логического сложения и умножения.
Результатом операции
or
будет "истина", если хотя бы один из операндов является "истиной". При этом если первый операнд имеет значение
true
, второй операнд не вычисляется — результат и так будет "истиной".