□ Объекты других типов преобразуются в число в соответствии с собственными правилами. Например, результирующий фрагмент дерева так же как и множество узлов сначала преобразуется к строке, а затем в численный формат.
number($to_be or not($to_be)) → 1
Значение этого выражения будет 1, поскольку $to_be or not($to_be) будет истинным вне зависимости от значения переменной to_be.
number(false()) → 0
number('00015.0001000') → 15.0001
number('.0001000') → 0.0001
number('1.') → 1
number('-.1') → -0.1
number('-5') → -5
Функция sum
number sum(node-set)
Функция sum суммирует значения узлов из переданного ей множества. Строковые значения узлов сначала преобразуются в числа, а затем все полученные числа складываются.
<list>
<item>1</item>
<item>3</item>
<item>5</item>
</list>
<xsclass="underline" stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsclass="underline" template match="list">
<xsclass="underline" copy>
<xsclass="underline" apply-templates/>
</xsclass="underline" copy>
</xsclass="underline" template>
<xsclass="underline" template match="item">
<sum>
<xsclass="underline" value-of select="sum(preceding-sibling::item|.)"/>
</sum>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
<list>
<sum>1</sum>
<sum>4</sum>
<sum>9</sum>
<sum>16</sum>
<sum>25</sum>
</list>
В этом преобразовании мы заменяем каждый элемент item на сумму значений предшествующих ему элементов плюс собственное значение. Предшествующие элементы выбираются путем выборки preceding-sibling::item, текущий элемент — сокращенным путем ".", затем эти два множества объединяются при помощи оператора |, и, наконец, мы вычисляем сумму значений узлов, входящих в них функцией sum.
Строковые значения суммируемых узлов преобразовываются в числовой формат так же, как они преобразовывались бы функцией number. Например, если входящий документ будет иметь вид
<list>
<item>1</item>
<item>3</item>
<item>five</item>
<item>7</item>
<item>9</item>
</list>
то на выходе мы получим
<list>
<sum>1</sum>
<sum>4</sum>
<sum>NaN</sum>
<sum>NaN</sum>
<sum>NaN</sum>
</list>
потому что, начиная с третьего элемента, в суммировании будет участвовать значение number('five'), то есть не-число (NaN).
Функции floor и ceiling
number floor(number)
number ceiling(number)
Функции floor и ceiling (англ. пол и потолок соответственно) осуществляют округление численного аргумента до ближайшего не большего и ближайшего не меньшего целого соответственно.
floor(2.3) → 2
ceiling(2.3) → 3
floor(-2.3) → -3
ceiling(-2.3) → -2
floor(-1 div 0) → -Infinity
ceiling(-1 div 0) → -Infinity
floor('zero') → NaN
ceiling(-1 div (-1 div 0)) → 0
Функция round
number round(number)
Функция round округляет число до ближайшего целого значения. У этой функции есть несколько нюансов, которые мы сейчас разберем.
□ Если дробная часть числа равна 0.5, то функция вернет ближайшее большее целое.
□ Если аргумент является не-числом (NaN), то результат также будет NaN.
□ Если аргумент является положительной или отрицательной бесконечностью, то результатом будет тоже положительная или отрицательная бесконечность, то есть аргумент не изменится.
□ Если аргумент является положительным или отрицательным нулем, результатом будет также положительный или отрицательный нуль, то есть аргумент не изменится.
□ Если аргумент меньше нуля, но больше или равен — 0.5, результатом будет отрицательный нуль.
round(2.5) → 3
round(2.49) → 2
round(-1.7) → -2
1 div round(0.5) → Infinity
1 div round(-0.5) → -Infinity
round(1 div 0) → Infinity
round('one') → NaN
Строковые функции
Функция string
string string(object?)
Подобно функциям boolean и number, функция string преобразует свой аргумент к строковому типу явным образом. Если аргумент опущен, функции передается множество узлов, состоящее из единственного контекстного узла.
Напомним вкратце правила приведения других типов к строке.
□ Булевые значения преобразуются в строку следующим образом:
• "истина" (true) преобразуется в строку "true";
• "ложь" (false) преобразуется в строку "false".
□ Числа преобразуются к строковому виду следующим образом: