Валиков Алексей Н.
Шрифт:
Листинг 6.3. Входящий документ
<list>
<item>1</item>
<item>3</item>
<item>5</item>
</list>
Листинг 6.4. Преобразование
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:template match="list">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="item">
<sum>
<xsl:value-of select="sum(preceding-sibling::item|.)"/>
</sum>
</xsl:template>
</xsl: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.
□ Если аргумент является положительной или отрицательной бесконечностью, то результатом будет тоже положительная или отрицательная бесконечность, то есть аргумент не изменится.