Saxon 9.8EE中xsl:variable变量赋值异常问题咨询
关于Saxon 9.8 EE中XSLT变量字符串插值的问题
嘿,这个问题我刚好踩过类似的坑,来给你拆解下为啥三种写法表现不一样:
第一种写法:
<xsl:variable name="error" select="'Error reading: ' || $file"/>这里用的是XPath的字符串拼接运算符
||,$file作为变量会被正常求值后和前面的字符串拼接,这是标准的XPath字符串组合方式,自然能正常工作。第二种写法:
<xsl:variable name="error"><text>Error reading: {$file}</text></xsl:variable>关键在于
<xsl:text>元素——从XSLT 2.0开始,<xsl:text>的内容支持文本值模板(Text Value Templates),{$变量名}这种语法会被自动解析成变量的值,而非字面量字符串,所以这种写法也能达到预期效果。第三种写法:
<xsl:variable name="error">Error reading: {$file}</xsl:variable>这就踩了默认行为的坑!默认情况下,
<xsl:variable>的直接内容属于普通文本节点,XSLT不会自动把{$file}当作变量插值处理,只会原封不动输出这个字符串。如果想要让这里的{$file}生效,你需要显式启用文本值模板功能:方法很简单,给
<xsl:variable>加上expand-text="yes"属性(这是XSLT 3.0的特性,Saxon 9.8 EE已经支持):<xsl:variable name="error" expand-text="yes">Error reading: {$file}</xsl:variable>或者你也可以在
<xsl:stylesheet>根元素上设置expand-text="yes",全局开启文本值模板功能,这样所有支持的元素都会自动解析{$变量}语法。
总结下:想用{$变量}这种直观的插值写法,要么用<xsl:text>包裹内容,要么给容器元素加上expand-text="yes"属性,不然XSLT就会把大括号里的内容当成普通文本啦~
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

