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

ЖАНРЫ

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

Шрифт:

<DISTANCE>This planet is farther from the Sun than Mercury.</DISTANCE> <!--В перигелии-->

 </PLANET>

 <PLANET>

<NAME>Earth</NAME>

<MASS UNITS="(Earth = 1)">1</MASS>

<DAY UNITS="days">1</DAY>

<RADIUS UNITS="miles">2107</RADIUS>

<DENSITY UNITS="(Earth = 1)">1</DENSITY>

<DISTANCE>This planet is farther from the Sun than Mercury.</DISTANCE> <!--В
перигелии-->

 </PLANET>

</PLANETS>

Применение оси preceding-sibling

Ось

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

Что, если, например, вам нужно создать шаблон, который будет выбирать только элементы

<DISTANCE>
в элементе
<PLANET>
Меркурия? Для этого можно проверить, существуют ли братья, предшествующие элементу
<DISTANCE>
, которые являются элементами
<NAME>
со строковым значением «
Mercury
». Если применить ось
preceding-sibling
(листинг 7.14), поиск будет ограничен текущим элементом
<PLANET>
, что означает, что Меркурий не будет выбран, если вы только не находитесь в нужном элементе
<PLANET>
.

Листинг 7.14. Применение оси preceding-sibling

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

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

 <xsl:output method="xml"/>

 <xsl:template match="DISTANCE[preceding-sibling::*='Mercury']">

<DISTANCE>This is the planet Mercury, closest to the Sun.</DISTANCE>

 </xsl:template>

 <xsl:template match="@*|node">

<xsl:copy>

<xsl:apply-templates select="@*|node"/>

</xsl:copy>

 </xsl:template>

</xsl:stylesheet>

А вот результат:

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

<?xml-stylesheet type="text/xml" href="#"?>

<PLANETS>

 <PLANET>

<NAME>Mercury</NAME>

<MASS UNITS="(Earth = 1)">.0553</MASS>

<DAY UNITS="days">58.65</DAY>

<RADIUS UNITS="miles">1516</RADIUS>

<DENSITY UNITS="(Earth = 1)">.983</DENSITY>

<DISTANCE>This is the planet Mercury, closest to the Sun.</DISTANCE> <!--В
перигелии-->

 </PLANET>

 <PLANET>

<NAME>Venus</NAME>

<MASS UNITS="(Earth = 1)">.815</MASS>

<DAY UNITS="days">116.75</DAY>

<RADIUS UNITS="miles">3716</RADIUS>

<DENSITY UNITS="(Earth = 1)">.943</DENSITY>

<DISTANCE UNITS="million miles">66.8</DISTANCE><!--B перигелии-->

 </PLANET>

 <PLANET>

<NAME>Earth</NAME>

<MASS UNITS="(Earth = 1)">1</MASS>

<DAY UNITS="days">1</DAY>

<RADIUS UNITS="miles">2107</RADIUS>

<DENSITY UNITS="(Earth = 1)">1</DENSITY>

<DISTANCE UNITS="million miles">128.4</DISTANCE><!--B перигелии-->

 </PLANET>

</PLANETS>

Применение оси self

Ось

self
содержит только контекстный узел. В соответствии с одним из сокращений XPath, как мы увидим дальше, вместо «
self::node
» можно использовать «.».

Эту ось полезно иметь в виду, поскольку, как вы помните из главы 4, если не задать ось, осью по умолчанию будет

child::
, а в некоторых случаях вам может понадобиться обратиться к действующему узлу. Например,
[self::PLANET]
примет значение истины только если контекстным узлом будет элемент
<PLANET>
.

В следующем примере я объединяю шаблоны для элементов

<NAME>
и
<MASS>
в один шаблон. Поскольку у этих элементов разный формат, я должен обращаться с ними по-разному внутри одного и того же шаблона (что можно сделать проверкой значений оси
self::NAME
, которая возвращает непустой набор узлов, если контекстным, узлом является элемент
<NAME>
, и
self::MASS
, возвращающей непустой набор узлов, если контекстным узлом является элемент
<MASS>
):

<xsl:template match="PLANET">

 <TR>

<TD><xsl:apply-templates select="NAME"/></TD>

<TD><xsl:apply-templates select="MASS"/></TD>

<TD><xsl:apply-templates select="RADIUS"/></TD>

<TD><xsl:apply-templates select="DAY"/></TD>

 </TR>

</xsl:template>

Поделиться с друзьями: