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

Кроме четырех типов данных XPath мы также будем использовать тип данных, поддерживаемый в XSLT 1.0, но не в XSLT 1.1 — фрагменты результирующего дерева, которые создаются элементами <xsclass="underline" variable> или <xsclass="underline" with-param>. Фрагменты результирующего дерева могут быть удобны в определенных случаях, как вы увидите далее в этой главе.

Наконец, в этой главе мы также рассмотрим элемент <xsclass="underline" key>. Впервые он нам встретился в главе 4, теперь мы изучим его более подробно.

Для введения вполне достаточно; давайте перейдем к работе, и начнем мы с переменных.

Элемент <xsclass="underline" variable>: создание переменных

Для создания переменных в XSLT служит элемент <xsclass="underline" variable>, обладающий следующими атрибутами:

• name (обязательный). Имя переменной, устанавливается в QName;

• select (необязательный). Выражение XPath, задающее значение переменной. Если опустить этот атрибут, значение переменной будет определяться содержимым <xsclass="underline" variable>.

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

Для создания переменной присвойте ее имя атрибуту name элемента <xsclass="underline" variable>, а значение переменной атрибуту select, как в следующем примере, в котором я создаю переменную number_books и сохраняю в ней значение 255: 

<xsclass="underline" variable name="number_books" select="255"/>

.

.

.

Получить значение переменной можно, добавив к ее имени префикс $:

<xsclass="underline" variable name="number=books" select="255"/>

<xsclass="underline" text>There are </xsclass="underline" text>

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

<xsclass="underline" text> books in my library </xsclass="underline" text>

Заметьте, что если вы присваиваете переменной литерал — как, например, присваивание значения «turkey» (индейка) переменной sandwich (бутерброд), — литерал необходимо заключить в кавычки, причем они должны отличаться от кавычек, в которые заключены значения атрибутов:

<xsclass="underline" variable name="sandwich" select="'turkey'"/>

В XSLT 1.0 нет необходимости в атрибуте select — данные можно заключить внутри самого элемента <xsclass="underline" variable>:

<xsclass="underline" variable name="sandwich">turkey</xsclass="underline" variable>

Формально, однако, при пропуске атрибута select в элементах <xsclass="underline" variable> или <xsclass="underline" with-param> и задании этим элементам содержимого вы создаете фрагмент результирующего дерева, который больше не допускается в XSLT 1.1.

Стоит отметить, что имя переменной может включать префикс, как, например, star:PLANET, который должен соответствовать активному пространству имен. Сравнения осуществляются не сравнением префиксов, а проверкой фактического URI префикса — поэтому star:PLANET может быть тем же самым, что и nebula:PLANET, если пространства имен star и nebula соответствуют одному и тому же URI.

Область видимости переменной

Элемент <xsclass="underline" variable> можно использовать как элемент верхнего уровня или внутри тела шаблона для создания переменных. Переменные, созданные в элементах <xsclass="underline" variable> высокого уровня, обладают глобальной областью видимости, созданные в телах шаблона — локальной. Область видимости переменной определяет, в какой части таблицы стилей вы можете ее использовать.

Областью видимости глобальной переменной является вся таблица стилей, подразумевая и импортированные или включенные таблицы стилей. Это означает, что переменная доступна в любом месте таблицы стилей, если только она не будет перекрыта локальной переменной с тем же именем. Можно даже обращаться к глобальной переменной до ее объявления. Однако нельзя создавать циклические ссылки (то есть если вы объявили a через b, нельзя объявлять b через а).

Область видимости локальной переменной ограничена следующими за ней братьями или потомками последующих братьев. В частности это значит, что если вы объявили переменную внутри таких элементов, как <xsclass="underline" choose>, <xsclass="underline" if> или <xsclass="underline" for-each>, она не будет доступна вне этих элементов.