在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到节点集中找到