我怎么知道xsl:variable包含多少个标签?

时间:2012-03-29 07:40:03

标签: xslt xpath xslt-1.0

在XSLT 1.0中,如果我声明了<xsl:variable>

<xsl:variable name="ListeEcheances">
    <bla/><bli/>
</xsl:variable>

我如何知道它是否为空?甚至更好:我怎么知道它包含多少个标签? (我知道这里有2个标签,但我的真实代码有点复杂:))

<xsl:when test="$ListeEcheances=''">返回true(它不计算标签,只计算文本);

<xsl:when test="count($ListeEcheances/*) > 0">遗憾地无法编译。

感谢您的帮助。

3 个答案:

答案 0 :(得分:5)

这确实是错误的,并且您的编译器在抛出错误时是正确的。您只能计算一个节点集cannot count a result tree fragment。您需要的是使用扩展函数转换节点集中的变量。

对于Saxon 6.5,这将是exsl:node-set。这适用于Saxon 6.5和任何支持EXSLT node-set功能的处理器(大多数都支持)。编辑:Jirka Kosek写下了node-set extensions per processor的清单,我确定你的名单在列表中。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0" xmlns:exsl="http://exslt.org/common">

    <xsl:variable name="ListeEcheances">
        <bla/><bli/>
    </xsl:variable>

    <xsl:template match="/">
        <xsl:choose>
            <xsl:when test="count(exsl:node-set($ListeEcheances)/*) > 0">
                <xsl:text>Larger then zero!</xsl:text>
            </xsl:when>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

输出:

<?xml version="1.0" encoding="utf-8"?>Larger then zero!

注意:如果您要使用XSLT 2.0,那么一切都是节点集,您不会遇到XSLT 1.0的这种尴尬,其中结果树片段几乎无用。

答案 1 :(得分:2)

尝试<xsl:when test="count($ListeEcheances/*) > 0">

或等待 - 也许你会得到像

这样的东西

Expression must evaluate to a node-set. count(-->$ListeEcheances<--/*) > 0

原因是变量是结果树片段,而不是节点集。 在XSLT 1.0中,您需要应用节点集函数,该函数在依赖于处理器的命名空间中可用 例如:<xsl:when test="count(msxsl:node-set($ListeEcheances/*)) > 0">

如果这不起作用,或者您无法发现要使用的命名空间,那么技巧可能会有所帮助:

<xsl:variable name="temp" select="$ListeEcheances"/>
<xsl:when test="count($temp/*) > 0">

这可行的原因可在stackoverflow rtf to node-set

中找到

答案 2 :(得分:2)

如果变量的内容在XSLT中声明,如示例所示,而不是动态评估,则可以使用document()函数来解析XSLT文件(这是一个XML文件)并评估用于计算变量中元素的XPath表达式:

count(document('')/*/xsl:variable[@name='ListeEcheances']/*)

使用带有空路径的文档功能将加载当前样式表的基本URI。