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

ЖАНРЫ

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

Шрифт:

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

http://www.starpowder.com

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

Ось parent (родитель) содержит родителя (и только родителя) контекстного узла, если таковой имеется.

Предположим, что я хочу изменить содержимое элемента Земли

<MASS>
на «The mass of Earth is set to 1.>> (Масса Земли принимается за 1). В следующем шаблоне (листинг 7.12) для этого проверяется, содержит ли родитель
<PLANET>
элемента
<MASS>
элемент
<NAME>
со строковым значением «Earth».

Листинг 7.12. Применение оси parent

<?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="@*|node">

<xsl:copy>

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

</xsl:copy>

 </xsl:template>

 <xsl:template match="MASS[parent::node/NAME='Earth']">

<MASS>The mass of Earth is set to 1.</MASS>

 </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 UNITS="million miles">43.4</DISTANCE><!--B перигелии-->

 </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>The mass of Earth is set to 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>

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

Ось

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

Пусть, например, мне нужно задать для содержимого элемента

<DISTANCE>
текст «This planet is farther from the Sun than Mercury.» (Эта планета расположена дальше от Солнца, чем Меркурий.), если рассматриваемая планета действительно дальше от Солнца, чем Меркурий. Один из способов сделать это — проверить, расположен ли Меркурий перед рассматриваемой планетой в соответствии с установленным в документе порядком, при помощи оси
preceding
(листинг 7.13).

Листинг 7.13. Применение оси preceding

<?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::*/NAME='Mercury']">

<DISTANCE>This planet is farther from the Sun than Mercury.</DISTANCE>

 </xsl:template>

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

<xsl:copy>

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

</xsl:copy>

 </xsl:template>

</xsl:stylesheet>

Если текущая планета расположена после Меркурия, я могу вставить сообщение в ее элемент

<DISTANCE>
. Результат следующий:

<?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 UNITS="million miles">43.4</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>

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