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

приводится к строке

The result is: You may visit the following link.

При приведении дерева к числу, оно сначала преобразовывается в строку, а затем в число. Это означает, что деревья, в принципе, можно использовать в арифметических операциях, несмотря на то, что они для этого не предназначены.

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

<numbers>

 <integer>1</integer>

 <real>1</real>

 <integer>2</integer>

 <real>2</real>

 <integer>3</integer>

 <real>3.5</real>

</numbers>

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

<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>&#xA; Integers:&#xA;</xsclass="underline" text>

   <xsclass="underline" value-of select="$integers"/>

   <xsclass="underline" text>&#xA;Reals:&#xA;</xsclass="underline" text>

   <xsclass="underline" value-of select="$reals"/>

   <xsclass="underline" text>&#xA;Reals minus integers:&#xA;</xsclass="underline" text>

   <xsclass="underline" value-of select="$reals - $integers"/>

   <xsclass="underline" text>&#xA;</xsclass="underline" text>

  </result>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

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

<result>

Integers:

123

Reals:

123.5

Reals minus integers:

0.5

</result>

Таблица преобразования типов

Для удобства использования все взаимные преобразования типов сведены в одну таблицу (табл. 3.2).

Таблица 3.2. Взаимные преобразования типов данных XSLT

Преобразовываемый тип
Целевой тип boolean (булевое значение) number (число) string (строка) node-set (множество узлов) tree (дерево)
boolean (булевое значение)  false NaN → false другое → true пустая → false непустая → true пустое → false другое → true всегда true
number (число) false0 true1 разбирается, как число в десятичном формате мн-во → строка → число дерево → строка → число
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 настолько велика, что здесь и далее мы будем рассматривать их как единое целое.