Шрифт:
<xsl:message terminate="yes">
Each planet must have a name!
</xsl:message>
</xsl:if>
<xsl:value-of select="NAME"/>
<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). Листинг 5.5. Второй пример <xsl:choose>
<?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>