我正在尝试创建一个XPath表达式,它将在XSL样式表和前面的文本节点中为我提供所有未使用的变量,如果它只是空白的话。
我目前的尝试是:
for $var in //xsl:variable|xsl:param return($var[not(following-sibling::*/descendant-or-self::*[@*[contains(., concat('$', $var/@name))]])]/(., preceding-sibling::text()[1][normalize-space(.) = '']))
但是,由于我依靠contains()
函数来获取变量,我也会得到假阴性,例如。
<xsl:variable name="abc"/>
<xsl:value-of select="$abcdef"/>
解决这个问题的最佳方法是什么?我认为必须使用正则表达式吗?
答案 0 :(得分:2)
如果您真的想要严格执行此操作,则需要详细了解变量绑定规则。例如,给定:
<xsl:template match="x">
<xsl:variable name="y"/>
<xsl:variable name="y"/>
<xsl:value-of select="$y"/>
</xsl:template>
然后第一个“y”变量未使用。
由于您可以转发对全局变量的引用而不是局部变量,因此这很复杂。
此外,如果您想要非常严格,那么您需要处理变量名称可以进行名称空间限定的事实,并且名称的匹配使用名称空间URI,而不是前缀。
例如,在注释掉的代码中出现的引用怎么样?
并不是众所周知,你可以在变量引用中的'$'和名称之间留下空格和注释:
$ (:no-one ever does this:) x + $ (:thankfully:) y
因此,第一个简单地检测已声明但从未出现在变量引用中的变量名称的剪切并不太难;一个严格的解决方案,不会出现误报,也不会出现漏报,需要访问样式表及其XPath表达式的完整解析树。这里的困难在于,通过明显的方式获得这样一个解析树(例如Saxon的SEF导出文件),未使用的变量将被丢弃。
练习的目的是什么:您打算如何使用结果?