<xsl:value-of select='NAME'/>
is planet number <xsl:value-of select='position()'/> from the sun.
</P>
<xsl:if test='position() = last()'><HR/><xsl:if>
</xsl:template>
</xsl:stylesheet>
Вот результат — как видите, элемент <HR> появляется только после последней перечисленной планеты:
<HTML>
<HEAD>
<TITLE>
Planets
</TITLE>
</HEAD>
<BODY>
<P>
Mercury is planet number 1 from the sun.
</P>
<P>
Venus is planet number 2 from the sun.
</P>
<P>
Earth is planet number 3 from the sun.
</P>
<HR>
</BODY>
</HTML>
Рассмотрим еще один пример — преобразование XML-XML, в котором перечисляются планеты из planets.xml
. Однако я хочу, чтобы выводилось не просто «The first three planets are: Mercury Venus Earth» (первые три планеты: Меркурий Венера Земля), a «The first three planets are: Mercury, Venus, and Earth». Необходимые знаки пунктуации можно добавить, определяя текущий элемент при помощи функции position
и проверяя позицию при помощи <xsl:if>
(листинг 5.2).
<?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='PLANETS'>
<DOCUMENT>
<TITLE>
The Planets
</TITLE>
<PLANETS>
The first three planets are: <xsl:apply-templates select='PLANET'/>
</PLANETS>
</DOCUMENT>
</xsl:template>
<xsl:template match='PLANET'>
<xsl:value-of select='NAME'/>
<xsl:if test='position()!=last()'>, </xsl:if>
<xsl:if test='position()=last()-1'>and </xsl:if>
<xsl:if test=position()=last()'>.</xsl:if>
</xsl:template>
</xsl:stylesheet>
Вот результат:
<?xml version=' 1.0' encoding='UTF-8'?>
<DOCUMENT>
<TITLE>
The Planets
</TITLE>
<PLANETS>
The first three planets are: Mercury, Venus, and Earth
</PLANETS>
</DOCUMENT>
Как видите, я смог добавить правильные знаки пунктуации, определяя место в документе при помощи <xsl:if>
.
При помощи <xsl:if>
можно также обнаруживать ошибки во время преобразования. Например, при помощи <xsl:if>
можно вывести сообщение, есть ли в planets.xml
элемент <NAME>
(листинг 5.3).
<?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='PLANETS'>
<DOCUMENT>
<TITLE>
The Planets
</TITLE>
<PLANETS>
The first three planets are: <xsl:apply-templates select='PLANET'/>
</PLANETS>
</DOCUMENT>
</xsl:template>
<xsl:template match='PLANET'>
<xsl:if test='NAME[not(text())]'>
<xsl:message terminate='yes'>
Each planet must have a name!
</xsl:message>
</xsl:if>
<xsl:value-of select='NAME'/>
<xsl:if test='position()!=last()'>. </xsl:if>
<xsl:if test='position()=last()-1'>and </xsl:if>
<xsl:if test='position()=last()'>.</xsl:if>
</xsl:template>
</xsl:stylesheet>