变量用于存储不可变值,参数用于接收可覆盖的外部输入;变量通过xsl:variable定义,一经赋值不可更改,适用于缓存计算结果或常量,如;参数通过xsl:param定义,支持默认值并可在调用时被覆盖,常用于模板间传参或配置行为,如;变量作用域限于声明位置及其子元素,全局变量在模板顶层定义;参数在模板调用或样式表启动时确定值,可通过命令行或API传入;关键区别在于可变性、作用时机和使用场景:变量不可重赋值,执行到时求值,适合内部固定数据;参数值可由外部注入,调用时确定,适合控制输出格式、语言等;注意命名区分大小写、不重复定义同名项、合理使用select和内容体、XSLT 2.0+支持类型声明提升健壮性;变量管“内部固定值”,参数管“外部可配值”,协同提升XSLT清晰度与灵活性。
XSLT中的变量和参数都用于存储值,但用途和行为不同:变量一旦赋值就不能更改,参数则可在调用时传入不同值,常用于模板间传递数据或定制样式表行为。
变量(xsl:variable):定义不可变的值
变量在作用域内只能赋值一次,适合保存计算结果、常量或临时中间值。它不依赖外部输入,定义即初始化。
- 用
定义简单值,如: - 用开始/结束标签包裹内容定义富文本或节点集,如:
Report
- 变量作用域是其声明所在的元素及其子元素;在模板顶层定义即为全局变量,可在整个样式表中引用(用 $name)
参数(xsl:param):支持外部传入的可覆盖值
参数本质是“可配置的变量”,默认值可被调用方覆盖,主要用于模板(xsl:template)或导入/包含的样式表中实现灵活复用。
- 在模板内定义参数:,表示默认显示日期
- 调用模板时传参:
- 主样式表可通过命令行或API传入初始参数(如 Saxon 的 -param:debug=true),此时顶层 xsl:param 会接收该值,覆盖 select 指定的默认值
变量与参数的关键区别
理解差异能避免误用:
- 可变性:变量不可重赋值;参数本身不可变,但其值可由调用方或处理器注入
-
作用时机:变量在执行到定义处时求值;参数在模板被调用(或样
式表启动)时确定值 - 典型场景:用变量缓存 XPath 结果(如 $items/count(*));用参数控制输出格式、语言、调试开关等
使用注意事项
几个易错点需留意:
- 变量名和参数名区分大小写,且必须以字母或下划线开头
- 不能在同一个作用域重复定义同名变量或参数
- 若用 select 属性定义变量,其值总是结果树片段(RTF)或原子值;若省略 select 且无内容体,变量值为空序列
- XSLT 2.0+ 支持类型声明(as="xs:string"),增强健壮性,建议对关键参数启用
基本上就这些。变量管“内部固定值”,参数管“外部可配值”,配合使用能让XSLT更清晰、更灵活、更易维护。

式表启动)时确定值






