<xsl:stylesheet version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xml: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:choose>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Нам нужно проверить, в каком месте документа мы находимся, при помощи включения нескольких элементов <xsl:when>
. У этого элемента только один атрибут:
• test
(обязательный). Принимает логическое (Boolean
) значение (true/false
) проверяемого условия.
Элемент <xsl:when>
содержит тело шаблона.
Атрибут проверки принимает значение true/false выражения, определяющего, будет ли применяться заключенное в элементе <xsl:when>
тело шаблона или нет. Например, вот как я добавил элементы <xsl:when>
с соответствующими знаками пунктуации для всех планет, кроме последней:
<?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:choose>
<xsl:when test='position()!=last()'>, </xsl:when>
<xsl:when test='position()=last()-1'>and </xsl:when>
.
.
.
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Эти два элемента <xsl:when> выбирают все элементы <PLANET>
за исключением последнего, поэтому элемент <xsl:otherwise>
можно применить для последнего элемента <PLANET>
. Тело шаблона в этом элементе будет применено, если ни в одном элементе <xsl:when>
в элементе <xsl:choose>
условие не примет значение true
.
У элемента <xsl:otherwise>
нет атрибутов, и он содержит тело шаблона. Вот как это выглядит в листинге 5.4.
<?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'/>