Книга: XSLT

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

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

Элемент <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'-->
<xsl:variable name="movie" select="'Goldfinger'"/><!-- Запрещено -->
 

Несмотря на все эти ограничения, вы можете менять значение переменной на каждом шаге цикла <xsl:for-each>, как мы увидим в следующем разделе.

Оглавление книги


Генерация: 1.397. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз