содержимого вы создаете фрагмент результирующего дерева, который больше не допускается в 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'-->