在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">
遗憾地无法编译。
感谢您的帮助。
答案 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。