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