содержимого вы создаете фрагмент результирующего дерева, который больше не допускается в XSLT 1.1.

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

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

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

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

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

Как правило, вы не можете изменять значение переменной, но вы можете перекрыть ее локальной переменной. То есть локальные переменные перекрывают глобальные в пределах области видимости локальных переменных. Пусть, например, я объявил переменную с именем movie (кинокартина):

<xsl:variable name='movie' select=''Mr. Blandings Builds His Dream House''/>

<!-- здесь $movie = 'Mr. Blandings Builds His Dream House' -- >

.

.

.

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

<xsl:variable name='movie' select=''Mr. Blandings Builds His Dream House''/>

<!-- здесь $movie = 'Mr Blandings Builds His Dream House'-->

<xsl:template match='entertainment'>

 <!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-- >

 .

 .

 .

Однако если вы объявите локальную переменную movie, в шаблоне эта версия перекроет глобальную переменную:

<xsl:variable name='movie' select=''Mr. Blandings Builds His Dream House''>

<!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-->

<xsl:template match='entertainment'>

 <!-- здесь $movie = Mr. Blandings Builds His Dream House'-->

 <xsl:variable name='movie' select=''Goldfinger''/>

 <!-- здесь $movie = 'Goldfinger'-->

 .

 .

 .

В этом случае мы перекрыли глобальную переменную при помощи глобальной. Заметьте, однако, что нельзя снова объявить одну и ту же переменную в одном шаблоне с целью попытаться изменить ее значение:

<xsl:variable name='movie' select=''Mr. Blandings Builds His Dream House''/>

<!-- здесь $movie = Mr. Blandings Builds His Dream House'-->

<xsl:template match='entertainment'>

 <!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-->

 <xsl:variable name='movie' select=''Goldfinger''/>

 <!-- здесь $movie = 'Goldfinger'-->

 <xsl:variable name='movie' select=''Withnail and I''/><!-- Запрещено -- >

 .

 .

 .

За пределами шаблона локальная переменная невидима, и movie содержит глобальное значение:

<xsl:variable name='movie' select=''Mr. Blandings Builds His Dream House''/>

<!-- здесь $movie = 'Mr Bindings Builds His Dream House' -->

<xsl:template match='entertainment'>

 <!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-->

 <xsl:variable name='movie' select=''Goldfinger''/>

 <!-- здесь $movie = 'Goldfinger'-->

 <xsl:variable name='movie' select=''Withnail and I''/><!-- Запрещено -->

</xsl:template>

<!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-- >

.

.

.

Глобальные переменные тоже нельзя объявлять повторно:

<xsl:variable name='movie' select=''Mr. Blandings Builds His Dream House''/>

<!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-->

<xsl:template match='entertainment'>

 <!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-->

 <xsl:variable name='movie' select=''Goldfinger''/>

 <!-- здесь $movie = 'Goldfinger'-->

 <xsl:variable name='movie' select=''Withnail and I''/><!-- Запрещено -->

</xsl:template>

<!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-->

Вы читаете XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату