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

PLANETS PLANET MASS

PLANETS PLANET

PLANETS

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

Ось descendant (потомок) содержит всех потомков контекстного узла. Заметьте, что сюда не входят атрибуты или узлы пространств имен, поскольку они не считаются дочерними узлами.

В следующем примере (листинг 7.6) демонстрируется работа с этой осью. На этот раз я хочу добавить примечание к элементу <PLANET> Меркурия: <INFO>Sorry, Mercury has blown up and is no longer available.</INFO> (Извините, но Меркурий взорвался и больше не доступен.). Чтобы найти Меркурий, мне достаточно только проверить, имеет ли какой-либо потомок элемента <PLANET> строковое значение «Mercury», что я сделаю при помощи выражения XPath внутри предиката выбора.

Листинг 7.6. Применение оси descendant

<?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='PLANET[descendant::*='Mercury']'>

  <xsl:copy>

   <xsl:apply-templates select='@*|node()'/>

   <INFO>Sorry. Mercury has blown up and is no longer available.</INFO>

  </xsl:copy>

 </xsl:template>

 <xsl:template match='@*|node()'>

  <xsl:copy>

   <xsl:apply-templates select='@*|node()'/>

  </xsl:copy>

 </xsl:template>

</xsl:stylesheet>

Вот результирующий документ, дополненный новым элементом <INFO> только для Меркурия:

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

<?xml-stylesheet type='text/xml' href='planets.xsl'?>

<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><!--В перигелии-- >

  <INFO>Sorry, Mercury has blown up and is no longer available.</INFO>

 </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>

 .

 .

 .

</PLANETS>

Применение оси descendant-or-self

Ось descendant-or-self содержит всех потомков контекстного узла и сам контекстный узел. Заметьте, однако, что она не содержит атрибутов и узлов пространств имен.

В следующем примере (листинг 7.7) демонстрируется работа с осью. В этом случае я создал упрощенную таблицу стилей (подробнее об упрощенных таблицах стилей см. главу 2), которая обрабатывает все элементы с использованием потомков, генерируя уже знакомую нам HTML-таблицу данных о планетах.

Листинг 7.7. Применение оси descendant-or-self

<HTML xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xsl:version='1.0'>

 <HEAD>

  <TITLE>

   The Planets Table

  </TITLE>

 </HEAD>

 <BODY>

  <H1>

   The Planets Table

  </Н1>

  <TABLE BORDER='2'>

   <TR>

    <TD>Name</TD>

    <TD>Mass</TD>

    <TD>Radius</TD>

    <TD>Day</TD>

   </TR>

   <xsl:for-each select='/descendant-or-self::node()/PLANET'>

    <TR>

     <TD><xsl:value-of select='NAME'/></TD>

     <TD><xsl:value-of select='MASS'/></TD>

     <TD><xsl:value-of select='RADIUS'/></TD>

     <TD><xsl:value-of select='DAY'/></TD>

Вы читаете XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату