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

ЖАНРЫ

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

Шрифт:

</PLANET>

Как выбрать только элементы, имеющие оба атрибута,

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

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

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

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

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

<xsl:apply-templates/>

</TABLE>

</BODY>

</HTML>

 </xsl:template>

 <xsl:template match="PLANET[@COLOR and @POPULATED]">

<TR>

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

<TD><xsl:apply-templates select="MASS"/></TD>

<TD><xsl:apply-templates select="RADIUS"/></TD>

<TD><xsl:apply-templates select="DAY"/></TD>

</TR>

 </xsl:template>

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

 </xsl:template>

 <xsl:template match="MASS">

<xsl:value-of select="."/>

<xsl:text> </xsl:text>

<xsl:value-of select="@UNITS"/>

 </xsl:template>

 <xsl:template match="RADIUS">

<xsl:value-of select="."/>

<xsl:text> </xsl:text>

<xsl:value-of select="@UNITS"/>

 </xsl:template>

 <xsl:template match="DAY">

<xsl:value-of select="."/>

<xsl:text> </xsl:text>

<xsl:value-of select="@UNITS"/>

 </xsl:template>

</xsl: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"?>

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

 .

 .

 .

Теперь я добавлю новое правило, выбирающее элементы

<NAME>
с текстом "
Venus
" (Венера) по образцу "
NAME[text='Venus']
". Хотя элементы
<NAME>
удовлетворяют обоим правилам этой таблицы стилей, правило с образцом "
NAME[text='Venus']
" осуществляет более узкий выбор, поэтому для элемента
<NAME>
Венеры процессор XSLT применит его:

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