ЖАНРЫ

Технология XSLT

Валиков Алексей Н.

Шрифт:

Имя переменной соответствует синтаксическому правилу

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>

Несложно видеть, что здесь мы определили глобальную переменную, а значит, ее значение можно использовать в преобразовании в любом месте. Например, мы можем определить через нее другие глобальные переменные, либо использовать в шаблоне:

<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
и так до бесконечности.

Дела с локальными переменными обстоят чуть-чуть сложнее. Для того чтобы объяснить, что же такое область видимости, обратимся к следующему преобразованию.

Листинг 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

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

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

<xsl:stylesheet <xsl:stylesheet

 version="1.0" xmlns:xsl="... "> version="1.0" xmlns:xsl="... ">

 <xsl:template match="/"> <xsl:template match="/">

<xsl:variable name="i" <xsl:variable name="i"

select="2"/> select="2"/>

<xsl:variable name="j" <xsl:variable name="j"

select="$i - 1"/> select="$i - 1"/>

<xsl:if test="$i > $j"> <xsl:if test="$i > $j">

<xsl:variable name="k"> <xsl:variable name="k">

<xsl:value-of select="$i"/> <xsl:value-of select="$i"/>

Поделиться с друзьями: