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