Имя переменной соответствует синтаксическому правилу
QName
, иными словами, оно может иметь вид
имя
или
префикс:имя
. Как правило, имена переменным даются без префиксов, однако в том случае, если префикс все же указан, переменная ассоциирует с некоторым объектом не простое, а расширенное имя. Соответственно, обращение к объекту должно будет производиться также посредством расширенного имени.
Область видимости переменных
Каждая из переменных имеет собственную область видимости (англ. scope) — область, в которой может быть использовано ее значение. Область видимости определяется следующим образом.
□ Областью видимости глобальной переменной является все преобразование, то есть значение переменной, объявленной элементом верхнего уровня, может быть использовано в преобразовании где угодно. К такой переменной можно обращаться даже до ее объявления, единственным ограничением является то, что переменная не должна определяться через собственное значение — явно или неявно.
□ Локальную переменную можно использовать только после ее объявления и только в том же родительском элементе, которому принадлежит объявляющий элемент
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>
Несложно видеть, что здесь мы определили глобальную переменную, а значит, ее значение можно использовать в преобразовании в любом месте. Например, мы можем определить через нее другие глобальные переменные, либо использовать в шаблоне:
Причем, как уже было сказано, глобальная переменная может быть использована и до объявления: в нашем случае переменная
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
и так до бесконечности.
Дела с локальными переменными обстоят чуть-чуть сложнее. Для того чтобы объяснить, что же такое область видимости, обратимся к следующему преобразованию.
Листинг 5.22. Преобразование, использующее переменные i, j, k и gt
<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
. На следующих четырех листингах мы выделим серой заливкой область видимости переменной (то есть область, где ее можно использовать), а само определение переменной отметим полужирным шрифтом.
Листинг 5.23. Области видимости переменных i, j, k и gt