приводится к строке
The result is: You may visit the following link.
При приведении дерева к числу, оно сначала преобразовывается в строку, а затем в число. Это означает, что деревья, в принципе, можно использовать в арифметических операциях, несмотря на то, что они для этого не предназначены.
<numbers>
<integer>1</integer>
<real>1</real>
<integer>2</integer>
<real>2</real>
<integer>3</integer>
<real>3.5</real>
</numbers>
<xsclass="underline" stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" variable name="integers">
<integers><xsclass="underline" copy-of select="/numbers/integer"/></integers>
</xsclass="underline" variable>
<xsclass="underline" variable name="reals">
<reals><xsclass="underline" copy-of select="/numbers/real"/></reals>
</xsclass="underline" variable>
<xsclass="underline" template match="/">
<result>
<xsclass="underline" text>
 Integers:
</xsclass="underline" text>
<xsclass="underline" value-of select="$integers"/>
<xsclass="underline" text>
Reals:
</xsclass="underline" text>
<xsclass="underline" value-of select="$reals"/>
<xsclass="underline" text>
Reals minus integers:
</xsclass="underline" text>
<xsclass="underline" value-of select="$reals - $integers"/>
<xsclass="underline" text>
</xsclass="underline" text>
</result>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
<result>
Integers:
123
Reals:
123.5
Reals minus integers:
0.5
</result>
Таблица преобразования типов
Для удобства использования все взаимные преобразования типов сведены в одну таблицу (табл. 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, в преобразованиях можно использовать переменные. Переменная определяется как имя, с которым связывается некоторое значение, например:
<xsclass="underline" variable name="url" select="'http://www.xsltdev.ru'"/>
создаст переменную с именем url
и присвоит ей строковое значение "http://www.xsltdev.ru"
. После этого переменную можно использовать в выражениях, например:
<xsclass="underline" value-of select="concat('Welcome to ', $url)"/>
Для того чтобы отличать переменные от путей выборки, в выражениях их именам предшествует префикс "$
": к значению переменной с именем url
мы обращались как к $url
.
Каждая из переменных имеет собственную область видимости (англ. visibility scope) — область документа преобразования, в которой может быть использовано ее значение. В зависимости от этого переменные могут быть глобальными (видимыми во всем преобразовании) и локальными (видимыми только в своем родительском элементе).
Помимо переменных, в преобразованиях и шаблонных правилах могут также определяться параметры. Принцип их действия полностью совпадает с принципом действия переменных с той лишь разницей, что значения, присваиваемые параметрам, являются значениями по умолчанию и могут быть изменены извне — например, вызывающим шаблонное правило элементом типа xsclass="underline" apply-templates
или xsclass="underline" call-template
, или самим процессором, если речь идет о глобальных параметрах.
Использование переменных и параметров в XSLT отличается от их использования в привычных процедурных языках программирования типа С++, Java или Object Pascal из-за того, что их значения не могут изменяться. После того, как переменной или параметру присвоено некоторое изначальное значение, оно будет оставаться неизменным.
Это ограничение оказывает значительное влияние на стиль программирования преобразований. В этом смысле XSLT намного ближе к функциональным языкам типа Lisp. Например, в XSLT часто используется рекурсия, которая является одним из основных принципов функционального программирования.
Выражения
Многие из задач, которые, так или иначе, выполняются во время преобразования, связаны с вычислением выражений. Для этих целей в XSLT используется язык XPath, который помимо выбора множеств узлов дерева может также выполнять некоторые основные операции над данными.
Несмотря на то, что XPath является самостоятельным языком, его роль в XSLT настолько велика, что здесь и далее мы будем рассматривать их как единое целое.