Чтение онлайн

на главную - закладки

Жанры

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

Шрифт:

 <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
» (голубой):

<xsl:variable name="COLOR">

 <xsl:choose>

<xsl:when test="@COLOR">

<xsl:value-of select="@COLOR"/>

</xsl:when>

<xsl:otherwise>blue</xsl:otherwise>

 </xsl:choose>

</xsl:variable>

Строковое значение фрагмента результирующего дерева (то есть либо значение атрибута

COLOR
, либо значение по умолчанию, «
blue
») присваивается переменной
COLOR
. Теперь в выражениях XPath можно обращаться к значению этой переменной,
$COLOR
, а не к значению атрибута (
@COLOR
, гарантированно получая при этом значение цвета, даже если у соответствующего элемента отсутствует атрибут
COLOR
.

Поделиться:
Популярные книги

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Саженец

Ланцов Михаил Алексеевич
3. Хозяин дубравы
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Саженец

Свет во мраке

Михайлов Дем Алексеевич
8. Изгой
Фантастика:
фэнтези
7.30
рейтинг книги
Свет во мраке

(Не)свободные, или Фиктивная жена драконьего военачальника

Найт Алекс
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(Не)свободные, или Фиктивная жена драконьего военачальника

Вамп

Парсиев Дмитрий
3. История одного эволюционера
Фантастика:
рпг
городское фэнтези
постапокалипсис
5.00
рейтинг книги
Вамп

Инвестиго, из медика в маги 2

Рэд Илья
2. Инвестиго
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Инвестиго, из медика в маги 2

Последняя Арена 4

Греков Сергей
4. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 4

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Неудержимый. Книга XI

Боярский Андрей
11. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XI

Двойник Короля 2

Скабер Артемий
2. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля 2