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

在XSLT中,xsl:variable 和 xsl: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 调用时设置,或被其他模板调用时传参),未传入时取默认值。常用于提高模板复用性和灵活性。
本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。 本书内容全面深入,适合各层次PHP和MySQL开发人员阅读,既是优秀的学习教程,也可用作参考手册。
- 声明参数:
<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"),有助于提前捕获类型错误









