XSLT变量怎么定义和使用 xsl:variable

xsl:variable用于定义不可变变量,支持select属性或标签体赋值,作用域限于声明块内,全局变量需在stylesheet顶层定义,局部变量优先级高于同名全局变量,引用时用$变量名。

xsl:variable 用于在 XSLT 中定义一个不可变的变量(注意:XSLT 中变量一旦赋值就不能修改,类似“常量”)。

定义变量:用 xsl:variable 声明

变量必须在模板(xsl:template)、模式(xsl:for-each)或样式表顶层作用域中定义。基本语法是:

  • 写法一(直接在属性中赋值):
  • 写法二(在标签体中赋值,支持复杂内容):

两种方式都有效。select 属性适合简单表达式;标签体方式适合拼接文本、嵌套元素或条件逻辑(比如配合 xsl:choose)。

变量作用域:只在定义它的块内有效

变量不能跨模板访问。例如:

  • xsl:template match="/" 里定义的变量,不能在子模板 xsl:template match="book" 中直接使用
  • 若需多个地方用同一个值,可把变量放在顶层(xsl:stylesheet 下),成为全局变量
  • 局部变量优先级高于同名全局变量(就近原则)

使用变量:通过 $变量名 引用

变量值通过带美元符的名称引用,可用于任何支持 XPath 表达式的地方:

  • ...

注意:不能用 $price 来赋值给另一个变量——除非它本身就是一个有效的 XPath 表达式结果(比如节点集、字符串、数字等)。

常见注意事项

  • 变量名必须符合 XML 名字规则(不能以数字开头,不能含空格和特殊符号)
  • 不支持“先声明后赋值”,必须定义时就初始化(XSLT 1.0/2.0/3.0 均如此)
  • 如果 select 表达式返回空序列,变量值为空(不是 null,也不是未定义)
  • XSLT 2.0+ 支持显式类型声明,如 as="xs:string",有助于调试和类型安全

基本上就这些。xsl:variable 看似简单,但作用域和不可变性容易忽略,写的时候多留意上下文。