如何用XSLT变量和参数 xsl:variable, xsl:param

1次阅读

xsl:variable用于定义不可变的局部值,作用域内只读;xsl:param用于定义可由调用方传入、带默认值的参数,支持模板复用与外部配置。

如何用XSLT变量和参数 xsl:variable, xsl:param

在XSLT中,xsl:variablexsl:param 是定义可重用值的核心机制,区别在于:变量一旦赋值就不能更改,参数则可由调用方传入(支持默认值),常用于模板间通信或外部配置。

定义和使用 xsl:variable

变量用于存储计算结果、字符串、节点集等,作用域为其声明所在的元素范围内(如模板、for-each 内)。它不可重新赋值,但可引用其他变量或函数结果。

  • 基本语法:<variable name="count" select="count(//item)"></variable> —— 直接用 select 计算并赋值
  • 内容体方式:<variable name="greeting">Hello, <value-of select="$user"></value-of>!</variable> —— 支持混合文本与表达式
  • 变量名必须以字母或下划线开头,不能含空格或特殊符号;引用时用 $变量名
  • XSLT 1.0 中变量是“只读且不可覆盖”的,即使同名变量在嵌套作用域中声明,也仅遮蔽外层,不修改其值

定义和使用 xsl:param

参数类似变量,但支持外部传入值(如通过 Java、.NET 调用时设置,或被其他模板调用时传参),未传入时取默认值。常用于提高模板复用性和灵活性。

  • 声明参数:<param name="limit" select="10"> —— 设定默认值为 10
  • 调用带参模板:<call-template name="format-list"><with-param name="limit" select="5"></with-param></call-template>
  • 在被调用模板内,$limit 将取传入的 5,而非默认的 10
  • 参数也可用内容体方式定义默认内容,适合复杂结构(如默认 xml 片段)

变量与参数的关键差异

理解两者的定位差异,能避免常见误用:

  • 可变性:变量赋值后不可变;参数值由调用上下文决定,运行时可能不同
  • 作用时机:变量在执行到其声明处时求值;参数在模板开始执行前完成绑定(含默认值计算)
  • 使用场景:局部中间结果(如计数、拼接字符串)用 xsl:variable;需要定制行为(如分页大小、语言标识、开关标志)用 xsl:param
  • 命名空间感知:两者都遵循 XSLT 的命名空间规则;若在带前缀的命名空间中声明,需注意前缀绑定一致性

实用技巧与注意事项

写得清晰、健壮的 XSLT 离不开对变量和参数的合理运用:

  • 优先用 select 属性而非内容体,性能更好(尤其处理大节点集时)
  • 避免在 for-each 外部定义依赖当前上下文的变量(如 select="text()"),否则可能取到意外节点
  • 参数值传入后即固化,不能在模板内再用 xsl:with-param 修改(那是传给子模板的)
  • XSLT 2.0+ 支持 as 属性声明类型(如 as="xs:Integer"),有助于提前捕获类型错误
text=ZqhQzanResources