在XSL中测试参数值类型

3
我从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的错误,但我认为当我运行这些测试并且值是一个字符串时,它会抛出上面的类型错误。

但最重要的是,有没有一种好的方法来测试参数值的类型?

更新:GitHub上完整的XSL脚本


2
@tmslnz:您应该知道您正在传递的数据类型。在XSLT/XPath 1.0中不存在类型检查这样的东西。虽然可以在XSLT/XPath 2.0中完成,但原因主要是模式感知而不是您尝试做的事情。 - user357812
@tmslnz:不清楚您为什么想要将参数作为$upload/meta相对路径的主要表达式,而不是在首先声明$upload为此meta元素。这样,您可以使用meta元素的字符串值或其他文字字符串。 - user357812
@Alejandro:上面的代码是Symphony CMS中使用的一个更大的XSL实用程序模板的一部分。它是围绕最常见的用例设计的,即上传字段返回的XML节点集。有时我想传递一个URL字符串值而不是节点集。我最初使用了两个不同的参数来实现它,但后来决定将它们合并为一个,以简化界面。我已经更新了问题,并附上了托管在Github上的完整XSL文件的链接。 - tmslnz
1
请注意,您提供的代码示例明显无效:模板中未定义$upload参数,因此XSLT处理器会因此引发错误。您的代码非常误导和令人困惑。请不要再这样做了。始终提供完整的代码,以便其他人可以重现问题。 - Dimitre Novatchev
2
@Dimitre-Novatchev:我发布的代码中有一个错误,其中“data”应该是“upload”。但是我的问题的范围比那段代码更广泛。我还在GitHub上提供了完整的代码链接。你真的不希望我在这里发布600多行的代码吧。请冷静点。 - tmslnz
显示剩余3条评论
1个回答

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接