результирующий фрагмент дерева, полученный в результате выполнения содержимого xsl:variable;
□ если атрибут select не определен и при этом сам элемент xsl:variable пуст, значением параметра по умолчанию будет пустая строка.
Использовать значения, присвоенные переменным при инициализации, можно, указывая впереди имени переменной символ '$', например для переменной x — $x. В XPath-выражениях синтаксис обращения к переменным соответствует продукции VariableReference.
Имя переменной соответствует синтаксическому правилу QName, иными словами, оно может иметь вид или
Область видимости переменных
Каждая из переменных имеет собственную
□ Областью видимости глобальной переменной является все преобразование, то есть значение переменной, объявленной элементом верхнего уровня, может быть использовано в преобразовании где угодно. К такой переменной можно обращаться даже до ее объявления, единственным ограничением является то, что переменная не должна определяться через собственное значение — явно или неявно.
□ Локальную переменную можно использовать только после ее объявления и только в том же родительском элементе, которому принадлежит объявляющий элемент xsl:variable. В терминах XPath область видимости локальной переменной будет определяться выражением
following-sibling:node()/descendant-or-self:node().
Для того чтобы до конца прояснить ситуацию, приведем несколько примеров.
Предположим, что мы определяем переменную с именем ID и значением 4 следующим образом:
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
...
<xsl:variable name='ID' select='4'/>
...
</xsl:stylesheet>
Несложно видеть, что здесь мы определили глобальную переменную, а значит, ее значение можно использовать в преобразовании в любом месте. Например, мы можем определить через нее другие глобальные переменные, либо использовать в шаблоне:
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
...
<xsl:variable name='leaf' select='//item[@id=$ID]'/>
<xsl:variable name='ID' select='4'/>
<xsl:variable name='path' select='$leaf/ancestor-or-self::item'/>
...
</xsl:stylesheet>
Причем, как уже было сказано, глобальная переменная может быть использована и до объявления: в нашем случае переменная leaf определяется через переменную ID, a path — через leaf. Конечно же, не следует забывать и то правило, что переменные не могут объявляться посредством самих себя, явно или неявно. Очевидно, что объявление:
<xsl:variable name='ID' select='$ID - 1'/>
было бы некорректным ввиду явного использования переменной при собственном определении. Точно так же были бы некорректны определения:
<xsl:variable name='ID' select='$id — 1/>
<xsl:variable name='id' select='$ID + 1'/>
поскольку переменная ID определяется через переменную id, которая определяется через переменную ID и так до бесконечности.
Дела с локальными переменными обстоят чуть-чуть сложнее. Для того чтобы объяснить, что же такое область видимости, обратимся к следующему преобразованию.
<xsl:stylesheet
version='1.0'
xmlns:xsl='... '>
<xsl:template match='/'>
<xsl:variable
name='i'
select='2'/>
<xsl:variable
name='j'
select='$i - 1'/>
<xsl:if test='$i > $j'>
<xsl:variable name='k'>
<xsl:value-of select='$i'/>
<xsl:value-of select='$gt'/>
<xsl:value-of select='$j'/>
</xsl:variable>
<result>
<xsl:copy-of select='$k'/>
</result>
</xsl:if>
</xsl:template>
<xsl:variable name='gt'>
is greater than
</xsl:variable>
</xsl:stylesheet>
В этом преобразовании определены три локальные переменные — i, j и k и одна глобальная переменная — gt. На следующих четырех листингах мы выделим серой заливкой область видимости переменной (то есть область, где ее можно использовать), а само определение переменной отметим полужирным шрифтом.
Область видимости переменной i Область видимости переменной
