找到这个XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="equipos.xsl"?>
<equipos>
<equipo nombre="Los paellas" personas="2"/>
<equipo nombre="Los arrocitos" personas="13"/>
<equipo nombre="Los gambas" personas="6"/>
<equipo nombre="Los mejillones" personas="3"/>
<equipo nombre="Los garrofones" personas="17"/>
<equipo nombre="Los limones" personas="7"/>
</equipos>
应用XSLT,输出必须是:
- 属性"personas"被一个名为"categoria"的属性覆盖
- " category "必须有"英勇"5
- 如果personas在5到10之间,"category"必须有英勇值2
- 如果personas> 10 " category "必须有英勇3
这是我现在的XSLT,但是我没有找到在choose…上获得"categoria"的第三个条件的方法
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="equipos">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<xsl:template match="equipo">
<xsl:copy>
<xsl:attribute name="nombre">
<xsl:value-of select="@nombre"/>
</xsl:attribute>
<xsl:attribute name="categoria">
<xsl:choose>
<xsl:when test="@personas < 5">
<xsl:text>1</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>2</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
您可以在choose
中添加任意数量的when
元素:
<xsl:choose>
<xsl:when test="@personas < 5">
<xsl:text>1</xsl:text>
</xsl:when>
<xsl:when test="@personas <= 10">
<xsl:text>2</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>3</xsl:text>
</xsl:otherwise>
</xsl:choose>
A choose
取第一个匹配的when
分支,所以你不需要在第二个分支中检查>=5
——你已经知道了,因为你没有取第一个。
但是为了将来参考,更惯用的XSLT方法可能是使用匹配模板而不是choose
结构:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- copy everything unchanged except when overridden -->
<xsl:template match="@*|node()">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
</xsl:template>
<xsl:template match="@personas[. < 5]" priority="10">
<xsl:attribute name="categoria">1</xsl:attribute>
</xsl:template>
<xsl:template match="@personas[. <= 10]" priority="9">
<xsl:attribute name="categoria">2</xsl:attribute>
</xsl:template>
<xsl:template match="@personas" priority="8">
<xsl:attribute name="categoria">3</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
这里我们需要显式的优先级,因为模式@personas[. < 5]
和@personas[. <= 10]
在默认情况下被认为是同等特定的。