在XSL中测试param值类型

时间:2011-03-25 22:44:21

标签: xslt xpath libxslt

我从LibXSLT得到这个:

XSLTProcessor::transformToXml(): Invalid type
XSLTProcessor::transformToXml(): xmlXPathCompiledEval: 1 objects left on the stack.

我正在传递param,它可以有字符串值或节点集。我试图测试它是否包含某个子字符串,并在这种情况下将该值分配给另一个参数。

调用模板:

<xsl:call-template name="img">
    <xsl:with-param name="upload" select="'url.com/image.jpg'"/>
    <xsl:with-param name="w" select="200"/>
    <xsl:with-param name="h" select="200"/>
</xsl:call-template>

被叫模板:

<xsl:template name="img" match="*" mode="w">
    <xsl:param name="upload" select="."/>

    <xsl:param name="JITexternal">
        <xsl:choose>
            <xsl:when test="
                not($upload/meta) and (contains($upload, '.jpg')
                or
                contains($upload, '.png'))
                ">
                <xsl:value-of select="$upload"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="0"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:param>
</xsl:template>

虽然我不确定是什么在绊倒LibXSLT,但我认为当我运行这些测试并且值是一个字符串时,它会抛出上面的类型错误。

但最重要的是,是否有一种测试param值的类型的好方法?

更新: full XSL script on GitHub

1 个答案:

答案 0 :(得分:3)

虽然不完全是类型检查,但我发现在运行测试之前将结果树片段转换为string()确实阻止了LibXSLT轰炸:

    <xsl:param name="JITexternal">
        <xsl:choose>
            <xsl:when test="starts-with(string($upload), 'http://')">
                <xsl:value-of select="$upload"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="0"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:param>