XSLT
Шрифт:
<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
.
Поделиться:
Популярные книги
Восход. Солнцев. Книга X
10. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Мастер 7
7. Мастер
Фантастика:
фэнтези
боевая фантастика
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Неудержимый. Книга XIV
14. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Все не случайно
Любовные романы:
современные любовные романы
7.10
рейтинг книги
Гром над Тверью
1. Гром над миром
Фантастика:
боевая фантастика
5.89
рейтинг книги
Идущий в тени 5
5. Идущий в тени
Фантастика:
фэнтези
рпг
5.50
рейтинг книги
Кровь, золото и помидоры
4. Венецианский купец
Фантастика:
альтернативная история
5.40
рейтинг книги
Неудержимый. Книга VIII
8. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
6.00
рейтинг книги
Чужое наследие
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Пистоль и шпага
2. Штуцер и тесак
Фантастика:
альтернативная история
8.28
рейтинг книги
Мастер 4
4. Мастер
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Темный Патриарх Светлого Рода 6
6. Темный Патриарх Светлого Рода
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Лорд Системы 14
14. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Падение Твердыни
6. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33