You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:23:33