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

      <TD>Mass</TD>

      <TD>Radius</TD>

      <TD>Day</TD>

     </TR>

     <xsclass="underline" apply-templates/>

    </TABLE>

   </BODY>

  </HTML>

 </xsclass="underline" template>

 <xsclass="underline" template match="PLANET[position() < 2]">

  <TR>

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

   <TD><xsclass="underline" apply-templates select="MASS"/></TD>

   <TD><xsclass="underline" apply-templates select="RADIUS"/></TD>

   <TD><xsclass="underline" apply-templates select="DAY"/></TD>

  </TR>

 </xsclass="underline" template>

 <xsclass="underline" template match="PLANET[position() >= 2]">

 </xsclass="underline" template>

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

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

  <xsclass="underline" text> </xsclass="underline" text>

  <xsclass="underline" value-of select="@UNITS"/>

 </xsclass="underline" template>

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

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

  <xsclass="underline" text> </xsclass="underline" text>

  <xsclass="underline" value-of select="@UNITS"/>

 </xsclass="underline" template>

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

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

  <xsclass="underline" text> </xsclass="underline" text>

  <xsclass="underline" value-of select="@UNITS"/>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

Вот результирующий документ — отметьте, что сохранилась только первая планета, Меркурий:

<HTML>

 <HEAD>

  <TITLE>

   The Planets Table

  </TITLE>

 </HEAD>

 <BODY>

  <H1>

   The Planets Table

  </H1>

  <TABLE BORDER="2">

   <TR>

    <TD>Name</TD>

    <TD>Mass</TD>

    <TD>Radius</TD>

    <TD>Day</TD>

   </TR>

   <TR>

    <TD>Mercury</TD>

    <TD>.0553 (Earth = 1)</TD>

    <TD>1516 miles</TD>

    <TD>58.65 days</TD>

   </TR>

  </TABLE>

 </BODY>

</HTML>

В следующем примере в элемент <PLANET> Земли были добавлены атрибуты COLOR (цвет) и POPULATED (населена):

<PLANET COLOR="blue" POPULATED="yes">

 <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">1284</DISTANCE><!--B перигелии-->

</PLANET>

Как выбрать только элементы, имеющие оба атрибута, COLOR и POPULATED? Можно применить предикат "[@COLOR and @POPULATED]". Чтобы убрать другие элементы — так, чтобы правило по умолчанию не поместило их текст в результирующий документ, — можно применить предикат "[not(@COLOR) or not(@POPULATED)]", как показано в листинге 4.11.

Листинг 4.11. Выбор только элементов с двумя атрибутами COLOR и POPULATED

<?xml version="1.0"?>

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

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

 <xsclass="underline" template match="/PLANETS">

  <HTML>

   <HEAD>

    <TITLE>

     Colorful, Populated Planets

    </TITLE>

   </HEAD>

   <BODY>

    <H1>

     Colorful, Populated Planets

    </H1>

    <TABLE BORDER="2">

     <TR>

      <TD>Name</TD>

      <TD>Mass</TD>

      <TD>Radius</TD>

      <TD>Day</TD>

     </TR>

     <xsclass="underline" apply-templates/>

    </TABLE>

   </BODY>

  </HTML>

 </xsclass="underline" template>

 <xsclass="underline" template match="PLANET[@COLOR and @POPULATED]">

  <TR>

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

   <TD><xsclass="underline" apply-templates select="MASS"/></TD>

   <TD><xsclass="underline" apply-templates select="RADIUS"/></TD>

   <TD><xsclass="underline" apply-templates select="DAY"/></TD>

  </TR>

 </xsclass="underline" template>

 <xsclass="underline" template match="PLANET[not(@COLOR) or not(@POPULATED)]">

 </xsclass="underline" template>

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

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

  <xsclass="underline" text> </xsclass="underline" text>

  <xsclass="underline" value-of select="@UNITS"/>

 </xsclass="underline" template>

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

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

  <xsclass="underline" text> </xsclass="underline" text>

  <xsclass="underline" value-of select="@UNITS"/>

 </xsclass="underline" template>

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

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

  <xsclass="underline" text> </xsclass="underline" text>

  <xsclass="underline" value-of select="@UNITS"/>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

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

<HTML>

 <HEAD>

  <TITLE>

   Colorful, Populated Planets

  </TITLE>

 </HEAD>

 <BODY>

  <H1>

   Colorful, Populated Planets

  </H1>

  <TABLE BORDER="2">

   <TR>

    <TD>Name</TD>

    <TD>Mass</TD>

    <TD>Radius</TD>

    <TD>Day</TD>

   </TR>

   <TR>

    <TD>Earth</TD>

    <TD>1 (Earth = 1)</TD>

    <TD>2107 miles</TD>

    <TD>1 days</TD>

   </TR>

  </TABLE>

 </BODY>

</HTML>

Этот документ показан на рис. 4.3.

Рис. 4.3. Применение предикатов XPath для проверки атрибутов

В следующем примере я копирую planets.xml в новый XML-документ и изменяю текст в элементе <NAME> Венеры на "The Planet of Love" (планета любви). Для этого я сначала копирую в результирующий документ все узлы и атрибуты:

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

  <xsclass="underline" copy>

   <xsclass="underline" apply-templates select="@*|node()"/>

  </xsclass="underline" copy>

 </xsclass="underline" template>