Категории
Самые читаемые
RUSBOOK.SU » Компьютеры и Интернет » Интернет » XSLT - Стивен Холзнер

XSLT - Стивен Холзнер

Читать онлайн XSLT - Стивен Холзнер

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 73 74 75 76 77 78 79 80 81 ... 115
Перейти на страницу:

Область видимости локальной переменной ограничена следующими за ней братьями или потомками последующих братьев. В частности это значит, что если вы объявили переменную внутри таких элементов, как <xsl:choose>, <xsl:if> или <xsl:for-each>, она не будет доступна вне этих элементов.

Как правило, вы не можете изменять значение переменной, но вы можете перекрыть ее локальной переменной. То есть локальные переменные перекрывают глобальные в пределах области видимости локальных переменных. Пусть, например, я объявил переменную с именем movie (кинокартина):

<xsl:variable name="movie" select="'Mr. Blandings Builds His Dream House'"/>

<!-- здесь $movie = 'Mr. Blandings Builds His Dream House" -->

.

.

.

Это элемент верхнего уровня, поэтому movie — глобальная переменная. Даже внутри шаблонов movie будет сохранять свое начальное значение, если не будет локальной переменной с таким же именем:

<xsl:variable name="movie" select="'Mr. Blandings Builds His Dream House'"/>

<!-- здесь $movie = "Mr Blandings Builds His Dream House'-->

<xsl:template match="entertainment">

 <!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-->

 .

 .

 .

Однако если вы объявите локальную переменную movie, в шаблоне эта версия перекроет глобальную переменную:

<xsl:variable name="movie" select="'Mr. Blandings Builds His Dream House'">

<!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-->

<xsl:template match="entertainment">

 <!-- здесь $movie = Mr. Blandings Builds His Dream House"-->

 <xsl:variable name="movie" select="'Goldfinger'"/>

 <!-- здесь $movie = 'Goldfinger'-->

 .

 .

 .

В этом случае мы перекрыли глобальную переменную при помощи глобальной. Заметьте, однако, что нельзя снова объявить одну и ту же переменную в одном шаблоне с целью попытаться изменить ее значение:

<xsl:variable name="movie" select="'Mr. Blandings Builds His Dream House'"/>

<!-- здесь $movie = Mr. Blandings Builds His Dream House"-->

<xsl:template match="entertainment">

 <!-- здесь $movie = 'Mr. Blandings Builds His Dream House"-->

 <xsl:variable name="movie" select="'Goldfinger'"/>

 <!-- здесь $movie = 'Goldfinger'-->

 <xsl:variable name="movie" select="'Withnail and I'"/><!-- Запрещено -->

 .

 .

 .

За пределами шаблона локальная переменная невидима, и movie содержит глобальное значение:

<xsl:variable name="movie" select="'Mr. Blandings Builds His Dream House'"/>

<!-- здесь $movie = 'Mr Bindings Builds His Dream House' -->

<xsl:template match="entertainment">

 <!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-->

 <xsl:variable name="movie" select="'Goldfinger'"/>

 <!-- здесь $movie = 'Goldfinger'-->

 <xsl:variable name="movie" select="'Withnail and I'"/><!-- Запрещено -->

</xsl:template>

<!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-->

.

.

.

Глобальные переменные тоже нельзя объявлять повторно:

<xsl:variable name="movie" select="'Mr. Blandings Builds His Dream House'"/>

<!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-->

<xsl:template match="entertainment">

 <!-- здесь $movie = 'Mr. Blandings Builds His Dream House"-->

 <xsl:variable name="movie" select="'Goldfinger'"/>

 <!-- здесь $movie = 'Goldfinger'-->

 <xsl:variable name="movie" select="'Withnail and I'"/><!-- Запрещено -->

</xsl:template>

<!-- здесь $movie = 'Mr. Blandings Builds His Dream House'-->

<xsl:variable name="movie" select="'Goldfinger'"/><!-- Запрещено --> 

Несмотря на все эти ограничения, вы можете менять значение переменной на каждом шаге цикла <xsl:for-each>, как мы увидим в следующем разделе.

Работа с переменными

Давайте рассмотрим примеры применения переменных. В следующем примере (листинг 9.1) я присваиваю переменной copyright сообщение об авторских правах и затем с ее помощью добавляю атрибут copyright во все элементы planets.xml.

Листинг 9.1. Применение переменной

<?xml version="1.0"?>

<xsl:stylesheet version="1.1"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output method="xml"/>

 <xsl:variable name="copyright" select="'(c)2002 Starpowder Inc.'"/>

 <xsl:template match="*">

  <xsl:copy>

   <xsl:attribute name="copyright">

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

   </xsl:attribute>

   <xsl:apply-templates/>

  </xsl:copy>

 </xsl:template>

</xsl:stylesheet>

Вот результирующий документ, дополненный атрибутами copyright

<?xml version="1.0" encoding="utf-8"?>

<PLANETS copyright="(c)2002 Starpowder Inc.">

 <PLANET copyright="(c)2002 Starpowder Inc.">

  <NAME copyright="(c)2002 Starpowder Inc.">Mercury</NAME>

  <MASS copyright="(c)2002 Starpowder Inc.">.0553</MASS>

  <DAY copyright="(с)2002 Starpowder Inc.">58.65</DAY>

  <RADIUS copyright="(c)2002 Starpowder Inc.">1516</RADIUS>

  <DENSITY copyright="(c)2002 Starpowder Inc.">.983</DENSITY>

  <DISTANCE copyright="(с)2002 Starpowder Inc.">43.4</DISTANCE>

 </PLANET>

 <PLANET copyright="(c)2002 Starpowder Inc.">

  <NAME copyright="(c)2002 Starpowder Inc.">Venus</NAME>

  <MASS copyright="(c)2002 Starpowder Inc.">.815</MASS>

  <DAY copyright="(с)2002 Starpowder Inc.">116.75</DAY>

  <RADIUS copyright="(c)2002 Starpowder Inc.">3716</RADIUS>

  <DENSITY copyright="(c)2002 Starpowder Inc.">.943</DENSITY>

  <DISTANCE copyright="(c)2002 Starpowder Inc.">66.8</DISTANCE>

 </PLANET>

 .

 .

 .

Переменные зачастую удобны для хранения значении, зависимых от контекста, и мы сейчас рассмотрим еще один пример, о котором я упоминал в начале главы. В этом случае я преобразую planets.xml в новый документ, в котором для каждой планеты будет один элемент. Каждый из этих новых элементов будет содержать два элемента <SIBLINGPLANET>, содержащих планеты-братья текущей планеты — например, братьями Земли будут Венера и Меркурий:

<?xml version="1.0" encoding="utf-8"?>

<Mercury>

 <SIBLINGPLANET>

  Venus

 </SIBLINGPLANET>

 <SIBLINGPLANET>

  Earth

 </SIBLINGPLANET>

</Mercury>

<Venus>

 <SIBLINGPLANET>

  Mercury

 </SIBLINGPLANET>

 <SIBLINGPLANET>

  Earth

 </SIBLINGPLANET>

</Venus>

<Earth>

 <SIBLINGPLANET>

  Mercury

 </SIBLINGPLANET>

 <SIBLINGPLANET>

  Venus

 </SIBLINGPLANET>

</Earth>

Для примера я поочередно выбираю каждый элемент <PLANET> и прохожу в цикле <xsl:for-each> по всем планетам, создавая элементы <SIBLINGPLANET> для всех планет, не являющихся контекстным узлом. Однако откуда мне известно внутри элемента <xsl:for-each>, какая из планет является контекстным узлом, выбранным шаблоном? Внутри элемента <xsl:for-each> «.» ссылается на текущий узел, с которым работает <xsl:for-each>, но не на контекстный узел шаблона. Проблему можно решить, если сохранить контекстный узел в переменной, которую я назвал contextnode:

<?xml version="1.0"?>

<xsl:stylesheet version="1.1"

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output method="xml"/>

 <xsl:template match="PLANETS">

  <xsl:for-each select="PLANET">

   <xsl:element name="{NAME}">

    <xsl:variable name="contextnode" select="."/>

    .

    .

    .

Теперь для проверки в цикле <xsl:for-each> того, что текущий элемент не является контекстным узлом, я могу обратиться к контекстному узлу шаблона как $contextnode (листинг 9.2).

Листинг 9.2. Хранение в переменной информации, зависимой от контекста

<?xml version="1.0"?>

<xsl:stylesheet version="1.1"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml"/>

 <xsl:template match="PLANETS">

  <xsl:for-each select="PLANET">

   <xsl:element name="{NAME}">

    <xsl:variable name="contextnode" select="."/>

    <xsl:for-each select="//PLANET">

     <xsl:if test=". != $contextnode">

      <xsl:element name="SIBLINGPLANET">

       <xsl:value-of select="NAME"/>

      </xsl:element>

     </xsl:if>

    </xsl:for-each>

   </xsl:element>

  </xsl:for-each>

 </xsl:template>

</xsl:stylesheet>

Теперь наша проблема решена.

Если у элемента <xsl:variable> есть тело, он создает переменную, чье значение является фрагментом результирующего дерева. В следующем примере при помощи фрагмента результирующего дерева я задаю значение по умолчанию для атрибута COLOR (цвет), если значение для него уже не задано. Значение по умолчанию я устанавливаю в «blue» (голубой):

1 ... 73 74 75 76 77 78 79 80 81 ... 115
Перейти на страницу:
На этой странице вы можете бесплатно скачать XSLT - Стивен Холзнер торрент бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Вася
Вася 24.11.2024 - 19:04
Прекрасное описание анального секса
Сергій
Сергій 25.01.2024 - 17:17
"Убийство миссис Спэнлоу" от Агаты Кристи – это великолепный детектив, который завораживает с первой страницы и держит в напряжении до последнего момента. Кристи, как всегда, мастерски строит