多项选择值和多于1个限制

  • 本文关键字:1个 选择 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"的属性覆盖
  • " 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 &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>

您可以在choose中添加任意数量的when元素:

<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>

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[. &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]在默认情况下被认为是同等特定的。

相关内容

  • 没有找到相关文章

最新更新