Шрифт:
Следующий пример, в котором я выбираю элементы
<PLANET>
при помощи шаблона (листинг 8.1), демонстрирует работу функции current
. Внутрь шаблона я поместил элемент <xsl:for-each>
, и шаблон применяется только в том случае, если выбранный шаблоном контекстный узел в то же время является и текущим узлом в очередной итерации в элементе <xsl:for-each>
. Листинг 8.1. Применение функции current
<?xml version="1.0"?>
<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>