<xsl:choose>
<xsl:when test='position()!=last()'>, </xsl:when>
<xsl:when test='position()=last()-1'>and </xsl:when>
<xsl:otherwise>.</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Вот как это работает; этот код дает тот же результат, что и код, проверяющий позицию элементов <PLANET>
при помощи <xsl:if>
:
<?xml version='1.0' encoding='UTF-8'?>
<DOCUMENT>
<TITLE>
The Planets
</TITLE>
<PLANETS>
The first three planets are: Mercury, Venus, and Earth.
</PLANETS>
</DOCUMENT>
Вот еще один пример преобразования XML-XML. В этом случае я преобразую planets.xml
в новый XML-документ, сохраняя только название каждой планеты и добавляя описание:
<?xml version='1.0' encoding='UTF-8'?>
<DOCUMENT>
<TITLE>
The Planets
</TITLE>
<PLANETS>
<PLANET>
<NAME>Mercury</NAME>
<DESCRIPTION>Hottest</DESCRIPTION>
</PLANET>
<PLANET>
<NAME>Venus</NAME>
<DESCRIPTION>Hot</DESCRIPTION>
</PLANET>
<PLANET>
<NAME>Earth</NAME>
<DESCRIPTION>OK</DESCRIPTION>
</PLANET>
</PLANETS>
</DOCUMENT>
Это преобразование можно реализовать, выбирая значение каждого элемента <NAME>
, то есть заключенный в нем текст (заметьте, что такого рода строки в XSLT учитывают регистр) (листинг 5.5).
<?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>
<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>
<PLANET>
<NAME>
<xsl:value-of select='NAME'/>
</NAME>
<DESCRIPTION>
<xsl:choose>
<xsl:when test='NAME='Mercury''>Hottest</xsl:when>
<xsl:when test='NAME='Venus''>Hot</xsl:when>
<xsl:when test='NAME='Earth''>OK</xsl:when>
</xsl:choose>
</DESCRIPTION>
</PLANET>
</xsl:template>
</xsl:stylesheet>
Вот и все.
Предположим теперь, что нам нужно добавить в каждый элемент <PLANET>
атрибут COLOR
:
<?xml version='1.0'?>
<?xml-stylesheet type='text/xml' href='planets.xsl'?>
<PLANETS>
<PLANET COLOR='RED'>
<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>
<PLANET COLOR='WHITE'>
<NAME>Venus</NAME>
<MASS UNITS='(Earth = 1)'>.815</MASS>