XSLT中的数字变量/参数

时间:2013-02-19 13:18:43

标签: variables xslt parameters tunneling

我有这个XSLT:

<xsl:template match="/">

    <xsl:variable name="errorCount" select="count($orders/*[1]/cm:Error)" />

    <xsl:apply-templates select="@*|node()">
        <xsl:with-param name="errorCount" select="$errorCount" tunnel="yes" />
    </xsl:apply-templates>
</xsl:template>

<xsl:template match="status">
    <xsl:param name="errorCount" tunnel="yes" />
    <xsl:copy>
        <xsl:choose>
            <xsl:when test="$errorCount > 0">
                <xsl:text>ERROR</xsl:text>
            </xsl:when>
            <xsl:otherwise>
                <xsl:text>OK</xsl:text>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:copy>
</xsl:template>

隧道和所有似乎都有效,但转换失败并出现以下错误:

  

'&gt;'的第一个操作数的必需项类型是数字;提供的值具有项类型xs:string

我首先在模板中使用了变量声明,然后它才能正常工作。移动它是因为我也需要在其他模板中使用相同的计数。

我/如何声明此变量/参数实际上是一个数字?

3 个答案:

答案 0 :(得分:6)

由于您使用的是XSLT 2.0,因此您还应该在模板中的xsl:param中添加as属性。例如(根据您需要的结果数量,您可能必须使用不同的值,例如,如果您将拥有包含小数的值;您还需要根据Michael Kay的观点更正隧道值) :

<xsl:param name="errorCount" tunnel="yes" as="xs:integer" />

如果转换无法转换为as类型(在本例中为整数),则转换将失败。 Eero的解决方案可能看起来更清晰,因为您仍然需要检查该值是否大于零。但是,因为您使用的是XSLT 2.0,最佳做法是键入您的参数/变量。

答案 1 :(得分:2)

您可以使用number()将字符串转换为数字:

<xsl:when test="number($errorCount) > 0">
  <xsl:text>ERROR</xsl:text>
</xsl:when>

答案 2 :(得分:2)

我怀疑是因为你写了tunnel =“true”而不是tunnel =“yes”,你根本没有指定隧道(错误地)忽略了这一事实,并且参数被赋予其默认值,即一个零长度的字符串。