При преобразовании дерева в строку результатом является конкатенация (строковое сложение) всех текстовых узлов дерева в порядке просмотра.
Пример
Результирующий фрагмент дерева
You may visit the following
link.
приводится к строке
The result is: You may visit the following link.
При приведении дерева к числу, оно сначала преобразовывается в строку, а затем в число. Это означает, что деревья, в принципе, можно использовать в арифметических операциях, несмотря на то, что они для этого не предназначены.
Пример
Листинг 3.13. Входящий документ:
1
1
2
2
3
3.5
Листинг 3.14. Преобразование:
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
Integers:
Reals:
Reals minus integers:
Листинг 3.15. Результат
Integers:
123
Reals:
123.5
Reals minus integers:
0.5
Таблица преобразования типов
Для удобства использования все взаимные преобразования типов сведены в одну таблицу (табл. 3.2).
Таблица 3.2. Взаимные преобразования типов данных XSLT
|
Преобразовываемый тип |
Целевой тип |
boolean (булевое значение) |
number (число) |
string (строка) |
node-set (множество узлов) |
tree (дерево) |
boolean (булевое значение) |
|
0 → false NaN → false другое → true |
пустая → false непустая → true |
пустое → false другое → true |
всегда true |
number (число) |
false → 0 true → 1 |
|
разбирается, как число в десятичном формате |
мн-во → строка → число |
дерево → строка → число |
string (строка) |
false → "false" true → "true" |
десятичная запись числа |
|
строковое значение первого узла в порядке просмотра |
строковое сложение всех текстовых узлов дерева |
node-set (множество узлов) |
нет |
нет |
нет |
|
нет |
tree (дерево) |
нет |
нет |
нет |
нет |
|
Несмотря на отсутствие побочных эффектов, которое является одним из основных принципов XSLT, в преобразованиях можно использовать переменные. Переменная определяется как имя, с которым связывается некоторое значение, например:
создаст переменную с именем url
и присвоит ей строковое значение "http://www.xsltdev.ru"
. После этого переменную можно использовать в выражениях, например:
Для того чтобы отличать переменные от путей выборки, в выражениях их именам предшествует префикс " $
": к значению переменной с именем url
мы обращались как к $url
.
Каждая из переменных имеет собственную область видимости (англ. visibility scope) — область документа преобразования, в которой может быть использовано ее значение. В зависимости от этого переменные могут быть глобальными (видимыми во всем преобразовании) и локальными (видимыми только в своем родительском элементе).
Помимо переменных, в преобразованиях и шаблонных правилах могут также определяться параметры . Принцип их действия полностью совпадает с принципом действия переменных с той лишь разницей, что значения, присваиваемые параметрам, являются значениями по умолчанию и могут быть изменены извне — например, вызывающим шаблонное правило элементом типа xsl:apply-templates
или xsl:call-template
, или самим процессором, если речь идет о глобальных параметрах.
Использование переменных и параметров в XSLT отличается от их использования в привычных процедурных языках программирования типа С++, Java или Object Pascal из-за того, что их значения не могут изменяться. После того, как переменной или параметру присвоено некоторое изначальное значение, оно будет оставаться неизменным.
Это ограничение оказывает значительное влияние на стиль программирования преобразований. В этом смысле XSLT намного ближе к функциональным языкам типа Lisp. Например, в XSLT часто используется рекурсия, которая является одним из основных принципов функционального программирования.
Многие из задач, которые, так или иначе, выполняются во время преобразования, связаны с вычислением выражений. Для этих целей в XSLT используется язык XPath, который помимо выбора множеств узлов дерева может также выполнять некоторые основные операции над данными.
Читать дальше