KnigaRead.com/

Алексей Валиков - Технология XSLT

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Алексей Валиков, "Технология XSLT" бесплатно, без регистрации.
Перейти на страницу:

Элемент xsl:variable

Синтаксис этого элемента в XSLT определен так:

<xsl:variable

 name="имя"

 select="выражение">

 <!-- Содержимое: шаблон -->

</xsl:variable>

Для объявления переменных в XSLT служит элемент xsl:variable, который может как присутствовать в теле шаблона, так и быть элементом верхнего уровня. Элемент xsl:variable связывает имя, указанное в обязательном атрибуте name, со значением выражения, указанного в атрибуте select или с деревом, которое является результатом выполнения шаблона, содержащегося в этом элементе. В том случае, если объявление переменной было произведено элементом верхнего уровня, переменная называется глобальной переменной. Переменные, определенные элементами xsl:variable в шаблонах (то есть не на верхнем уровне) называются локальными переменными.

Таким образом, объявление переменной в XSLT происходит всего в два шага:

□ сначала вычисляется значение присваиваемого выражения;

□ затем полученное значение связывается с указанным именем.

Значение присваиваемого выражения вычисляется в зависимости от того, как был определен элемент xsl:variable:

□ если в элементе xsl:variable определен атрибут select, то значением присваиваемого выражения будет результат вычисления выражения, указанного в этом атрибуте;

□ если атрибут select не определен, но сам элемент xsl:variable имеет дочерние узлы (иными словами, содержит шаблон), значением определяемой переменной будет результирующий фрагмент дерева, полученный в результате выполнения содержимого xsl:variable;

□ если атрибут select не определен и при этом сам элемент xsl:variable пуст, значением параметра по умолчанию будет пустая строка.

Использовать значения, присвоенные переменным при инициализации, можно, указывая впереди имени переменной символ "$", например для переменной x — $x. В XPath-выражениях синтаксис обращения к переменным соответствует продукции VariableReference.

Имя переменной соответствует синтаксическому правилу 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"/>

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

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

   </xsl:variable>                  </xsl:variable>

   <result>                         <result>

    <xsl:copy-of select="$k"/>       <xsl:copy-of select="$k"/>

   </result>                        </result>

  </xsl:if>                        </xsl:if>

 </xsl:template>                  </xsl:template>

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

  is greater than                  is greater than

 </xsl:variable>                  </xsl:variable>

</xsl:stylesheet>                </xsl:stylesheet>

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

<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"/>

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

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*