Выбрать главу

□ Объекты других типов преобразуются в число в соответствии с собственными правилами. Например, результирующий фрагмент дерева так же как и множество узлов сначала преобразуется к строке, а затем в численный формат.

Примеры

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 суммирует значения узлов из переданного ей множества. Строковые значения узлов сначала преобразуются в числа, а затем все полученные числа складываются.

Пример
Листинг 6.3. Входящий документ

<list>

 <item>1</item>

 <item>3</item>

 <item>5</item>

</list>

Листинг 6.4. Преобразование

<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>

Листинг 6.5. Результат

<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".

□ Числа преобразуются к строковому виду следующим образом: