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
, второй операнд не вычисляется — результат и так будет 'истиной'.
Результатом операции and
будет 'истина', если оба операнда истинны. При этом если первый из операндов — 'ложь', то второй операнд не вычисляется — результат и так будет 'ложью'.
Функции
Функции значительно расширяют возможности выражений. Они принимают на вход несколько аргументов и возвращают некоторый результат, который иногда является продуктом весьма замысловатого вычисления.
Функции можно условно разделить на
Контекст вычисления выражений
Выражения всегда вычисляются в некотором контексте — окружении, которое зависит от того, какая часть документа обрабатывается XSLT-процессором в данный момент, и какие объявления присутствовали в самом преобразовании.
Контекст преобразования состоит из узла, называемого контекстным узлом, двух целых чисел —
Контекст самым непосредственным образом влияет на вычисление выражений. Относительные пути выборки отсчитываются от контекстного узла, вычисление многих функций также производится в зависимости от контекста. Кроме того, в выражениях нельзя использовать функции, пространства имен и переменные, не присутствующие в контексте.
Для того чтобы показать, как изменяется контекст во время преобразования, мы напишем шаблон, который заменяет все элементы входящего документа элементами вида:
<element
name='имя элемента'
context-position='позиция в контексте'
context-size='размер контекста'
string-value='строковое значение'>
...
</element>
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output indent='yes'/>
<xsl:strip-space elements='*'/>
<xsl:template match='*'>
<element
name='{name()}'
context-position='{position()}'
context-size='size()'
string-value='{.}'>
<xsl:apply-templates select='*'/>
</element>
</xsl:template>
</xsl:stylesheet>
<data>
<part>
<item>A</item>
<item>B</item>
<item>C</item>