我如何知道xsl:variable包含多少个标记



在XSLT1.0中,如果我有一个<xsl:variable>声明如下:

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

我怎么知道它是不是空的?或者更好:我怎么知道它包含多少标签?(我知道这里有2个标签,但我的真实代码有点复杂:)

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

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

谢谢你的帮助。

这确实是不正确的,您的编译器抛出错误是正确的。您只能计算一个节点集,不能计算结果树片段。您需要的是使用扩展函数来转换节点集中的变量。

对于Saxon 6.5,这将是exsl:node-set。这适用于Saxon 650和任何支持EXSLT节点集函数的处理器(大多数do)。编辑:Jirka Kosek写下了每个处理器的节点集扩展列表,我相信你的也在列表中。

<?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!

注意:如果您使用XSLT2.0,那么所有内容都是一个节点集,您不会遇到XSLT1.0的这种尴尬,因为结果树片段几乎是无用的。

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

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

使用带有空路径的document函数将加载当前样式表的基本URI。

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

或者等等——也许你会得到类似的东西

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

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

如果这不起作用,或者你无法找到要使用的命名空间,那么一个技巧可能会有所帮助:

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

这种工作原理可以在stackoverflow rtf到节点集中找到

相关内容

  • 没有找到相关文章

最新更新