1

我有这个 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>

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

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

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

我如何/在哪里声明这个变量/参数实际上是一个数字?

4

3 回答 3

7

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

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

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

于 2013-02-19T13:47:10.730 回答
2

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

<xsl:when test="number($errorCount) > 0">
  <xsl:text>ERROR</xsl:text>
</xsl:when>
于 2013-02-19T13:28:03.370 回答
2

My suspicion is that because you wrote tunnel="true" rather than tunnel="yes", the fact that you specified tunnel at all is being (incorrectly) ignored, and the parameter is being given its default value, which is a zero-length string.

于 2013-02-19T16:19:34.800 回答