Выбрать главу

    <TD>Mass</TD>

    <TD>Radius</TD>

    <TD>Day</TD>

   </TR>

   <xsclass="underline" for-each select="/descendant-or-self::node()/PLANET">

    <TR>

     <TD><xsclass="underline" value-of select="NAME"/></TD>

     <TD><xsclass="underline" value-of select="MASS"/></TD>

     <TD><xsclass="underline" value-of select="RADIUS"/></TD>

     <TD><xsclass="underline" value-of select="DAY"/></TD>

    </TR>

   </xsclass="underline" for-each>

  </TABLE>

 </BODY>

</HTML>

Вот и все. Я применил здесь упрощенную таблицу стилей, чтобы подчеркнуть, что при помощи таких осей потомков, как descendant или descendant-or-self, вы можете автоматически обрабатывать все выбираемые узлы, во многом аналогично тому, как это делают элементы <xsclass="underline" for-each> или <xsclass="underline" template>.

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

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

В этом примере (листинг 7.8) я выбираю каждый элемент <PLANET> и копирую все последующие элементы в результирующий документ.

Листинг 7.8. Применение оси following

<?xml version="1.0"?>

<xsclass="underline" stylesheet version="1.0"

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

 <xsclass="underline" output method="xml"/>

 <xsclass="underline" template match="PLANET">

  <xsclass="underline" for-each select="following::*">

   <xsclass="underline" copy-of select="."/>

  </xsclass="underline" for-each>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

Далее показан результат. Обратите внимание на то, что, когда этот шаблон выбирает элемент <PLANET> Меркурия, он копирует все последующие элементы — то есть Венеру, затем всех потомков Венеры, далее Землю и затем всех потомков Земли. После этого он выбирает элемент <PLANET> Венеры и копирует все следующие элементы, то есть Землю и всех потомков Земли:

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

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

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

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

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

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

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

С другой стороны, при использовании оси following-sibling в результирующий документ будут скопированы только следующие братья, то есть только элементы <PLANET>, как мы увидим в следующем разделе.

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

Ось following-sibling содержит всех последующих братьев контекстного узла.

Например, я могу выбрать каждый элемент <PLANET> и скопировать в результирующий документ все узлы в оси following-sibling следующим образом (листинг 7.9).

Листинг 7.9. Применение оси following-sibling

<?xml version="1.0"?>

<xsclass="underline" stylesheet version="1.0"

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

 <xsclass="underline" output method="xml"/>

 <xsclass="underline" template match="PLANET">

  <xsclass="underline" for-each select="following-sibling::*">

   <xsclass="underline" copy-of select="."/>

  <xsclass="underline" for-each>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

При этом сначала копируются два узла-брата, следующие за Меркурием (Венера и Земля), затем копируется следующий узел-брат Венеры, Земля. У самой Земли нет следующих за ней братьев, поэтому результат выглядит так:

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

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