多项选择值和超过1个限制

时间:2014-03-24 17:06:04

标签: xml xslt xslt-1.0

获得此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”的属性
  • “categoria”必须具有英雄1,如果人物角色&lt; 5
  • “categoria”必须具有勇气2,如果角色是5和10之间
  • 如果角色&gt;
  • “categoria”必须具有勇气3 10

这是我现在的XSLT,但我没有找到选择“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 &lt; 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>

1 个答案:

答案 0 :(得分:2)

您可以在when

中拥有任意数量的choose元素
<xsl:choose>
    <xsl:when test="@personas &lt; 5">
        <xsl:text>1</xsl:text>
    </xsl:when>
    <xsl:when test="@personas &lt;= 10">
        <xsl:text>2</xsl:text>
    </xsl:when>
    <xsl:otherwise>
        <xsl:text>3</xsl:text>
    </xsl:otherwise>
</xsl:choose>

choose会占用第一个匹配的when分支,因此您无需在第二个分支中检查>=5 - 您已经知道这一点,因为您没有&#39} ;取第一个。

但是为了将来参考,更方便的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[. &lt; 5]" priority="10">
    <xsl:attribute name="categoria">1</xsl:attribute>
  </xsl:template>

  <xsl:template match="@personas[. &lt;= 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[. &lt; 5]@personas[. &lt;= 10]被视为同等特定。