Алексей Валиков - Технология XSLT
<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".
□ Числа преобразуются к строковому виду следующим образом:
• не-число (NaN) преобразуется в строку "NaN";
• положительный нуль преобразуется в строку "0";
• отрицательный нуль преобразуется в строку "0";
• положительная бесконечность преобразуется в строку "Infinity";
• отрицательная бесконечность преобразуется в строку "-Infinity";
• положительные целые преобразуются в свое десятичное представление без ведущих нулей и без точки ("."), отделяющей дробную часть от целой;
• отрицательные целые преобразуются так же, как и положительные, но с начальным знаком "минус" ("-");
• остальные числа преобразуются в десятичное представление с использованием точки ("."), отделяющей целую часть от дробной части; целая часть не содержит ведущих нулей (кроме случая с числами в интервале (-1;1)), дробная часть содержит столько цифр, сколько требуется для точного представления числа.
□ Множество узлов преобразуется в строковое значение своего первого в порядке просмотра документа узла. Если множество пусто, функция возвращает пустую строку.
□ Объекты других типов преобразуются в строку в соответствии с собственными правилами. Например, результирующий фрагмент дерева преобразуется в конкатенацию всех своих строковых узлов.
Примерыstring(boolean(0)) → false
string(number('zero')) → NaN
string(number('.50000')) →0.5
string(number(00500.)) → 500
Для строкового форматирования чисел рекомендуется использовать функцию XSLT format-number совместно с элементом xsl:decimal-format.
Функция concat
string concat(string, string, string*)
Функция concat принимает на вход две или более строки и возвращает конкатенацию (строковое сложение) своих аргументов.
Пример:
concat('not','with','standing',' problem') → 'notwithstanding problem'
Функция starts-with
boolean starts-with(string, string)
Функция starts-with принимает на вход два строковых аргумента и возвращает true, если первая строка начинается второй и false в противном случае.
starts-with('http://www.xsltdev.ru', 'http') → true
starts-with('Title', 'ti') → false
Функция contains
boolean contains(string, string)
Функция contains принимает на вход два строковых аргумента и возвращает true, если первая строка содержит вторую и false в противном случае.
contains('[email protected]', '(@') → true
Функция substring-before
string substring-before(string, string)
Функция substring-before принимает на вход два строковых аргумента. Эта функция находит в первой строке вторую и возвращает подстроку, которая ей предшествует. Если вторая строка не содержится в первой, функция вернет пустую строку.
Примерыsubstring-before('12-May-1998', '-') → '12'
substring-before('12 May 1998', ' ') → '12'
substring-before('12 May 1998', ' ') → '12'
substring-before('12 May 1998', '-') → ''
Функция substring-after
string substring-after(string, string)
Эта функция аналогична функции substring-before, только она возвращает строку, которая следует за вторым аргументом. Если вторая строка не содержится в первой, эта функция также вернет пустую строку.
Примерыsubstring-after('12-May-1998', '-') → 'May-1998'
substring-after('12 May 1998', ' ') → 'May 1998'
substring-after('12 May 1998', ' ') → 'May 1998'
substring-after('12 May 1998', '-') → ''
Функция substring
string substring(string, number, number?)
Функция substring возвращает подстроку переданного ей строкового аргумента, которая начинается с позиции, указанной вторым аргументом и длиной, указанной третьим аргументом. Если третий аргумент опущен, подстрока продолжается до конца строки. Если численные аргументы являются нецелыми, они округляются при помощи функции round.
В XPath позицией первого символа является 1, а не 0, как в некоторых других языках программирования.
При вычислении подстроки учитываются следующие условия.
□ Если первый численный аргумент меньше 1 (это относится и к отрицательной бесконечности), то подстрока начинается с начала строки.
□ Если первый численный аргумент больше длины строки (это относится и к положительной бесконечности), то подстрока будет пустой.