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

ЖАНРЫ

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

Шрифт:

<xsl:stylesheet version="1.0"

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

 <xsl:template match="/PLANETS">

<HTML>

.

.

.

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

<xsl:for-each select="/PLANETS/*[.=current]">

<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:for-each>

 </xsl:template>

 <xsl:template match="MASS">

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

Результат

применения этой таблицы стилей будет точно таким же, как если бы элемента
<xsl:for-each>
вообще не было, потому что тело элемента
<xsl:for-each>
применяется только тогда, когда контекстный узел совпадает с текущим узлом.

document

Функция

document
особенно полезна, потому что с ее помощью можно читать несколько документов и обрабатывать их содержимое. Функция
document
применяется следующим образом:

node-set document(uri, base-uri?)

Функция принимает параметр

uri
, который может представлять собой URI читаемого документа или набор узлов, чьи строковые значения задают идентификаторы URI. Второй, необязательный параметр
base-uri
представляет собой набор узлов, базовый URI которого используется для вычисления всех относительных URI, могущих находиться в параметре
uri
.

В следующем примере (листинг 8.2) я обрабатываю в процессоре XSLT один документ,

planets1.xml
, и также считываю и обрабатываю второй документ,
planets2.xml
.
Вот
planets1.xml
.

Листинг 8.2. planets1.xml

<?xml version="1.0"?>

<?xml-stylesheet type="text/xml" href="#"?>

<PLANETS href="#">

</PLANETS>

Вот

planets2.xml
— в элементе
<PLANET>
содержится одна планета (листинг 8.3).

Листинг 8.3. planets2.xml

<?xml version="1.0"?>

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

</PLANET>

А вот таблица стилей

planets.xml
, которую я применяю к
planets1.xml
. Таблица стилей содержит шаблон, выбирающий элемент
<PLANET>
в
planets1.xml
, и в этом шаблоне я считываю
planets2.xml
при помощи
<xsl:apply-templates>
и функции
document
(листинг 8.4).

Листинг 8.4. Применение функции document

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

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>

<xsl:apply-templates select="document(@href)"/>

</TABLE>

</BODY>

</HTML>

 </xsl:template>

 <xsl:template match="PLANET">

<TR>

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

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

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

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