Выбрать главу

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

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

Листинг 5.22. Преобразование, использующее переменные i, j, k и gt

<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. На следующих четырех листингах мы выделим серой заливкой область видимости переменной (то есть область, где ее можно использовать), а само определение переменной отметим полужирным шрифтом.

Листинг 5.23. Области видимости переменных 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>