XSLT中的<xsl:variable>和<xsl:param>都是用来定义值的元素,但两者的设计定位和适用场景存在明显差异,理解这些差异能帮助你更合理地编写XSLT转换逻辑。

核心差异对比
首先通过表格快速了解两者的核心区别:
| 对比维度 | xsl:variable | xsl:param |
|---|---|---|
| 赋值方式 | 定义时直接赋值,后续不可修改 | 定义时可设置默认值,调用时可传入新值覆盖 |
| 作用范围 | 仅在定义它的模板或样式表内有效 | 可在定义时指定作用范围,也支持跨模板传递 |
| 使用场景 | 定义固定不变的复用值 | 定义可灵活传入的可变参数 |
xsl:variable的使用方法
<xsl:variable>用于定义不可变的变量,一旦赋值后在整个作用范围内都无法修改,适合存储转换过程中固定需要用到的值。
基础定义示例
以下代码定义了一个存储网站基础URL的变量,然后在输出节点时引用该变量:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 定义全局变量,存储基础URL -->
<xsl:variable name="baseUrl">https://ipipp.com</xsl:variable>
<xsl:template match="/">
<html>
<body>
<!-- 引用变量拼接完整链接 -->
<a href="{$baseUrl}/article/123">文章链接</a>
<p>基础URL是:<xsl:value-of select="$baseUrl"/></p>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
局部变量示例
变量也可以在模板内部定义,仅在当前模板内生效:
<xsl:template match="user"> <!-- 局部变量,仅当前模板可用 --> <xsl:variable name="fullName" select="concat(first_name, ' ', last_name)"/> <p>用户全名:<xsl:value-of select="$fullName"/></p> </xsl:template>
xsl:param的使用方法
<xsl:param>用于定义参数,支持设置默认值,在调用对应模板或样式表时可以传入新值覆盖默认值,适合需要灵活调整的场景。
模板参数示例
以下代码定义了一个接收货币符号参数的模板,调用时可以根据需要传入不同的符号:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 定义带参数的模板,默认货币符号为¥ -->
<xsl:template name="formatPrice">
<xsl:param name="price"/>
<xsl:param name="symbol" select="'¥'"/>
<p>价格:<xsl:value-of select="$symbol"/><xsl:value-of select="$price"/></p>
</xsl:template>
<xsl:template match="/">
<html>
<body>
<!-- 调用模板,使用默认参数 -->
<xsl:call-template name="formatPrice">
<xsl:with-param name="price" select="99"/>
</xsl:call-template>
<!-- 调用模板,传入自定义参数 -->
<xsl:call-template name="formatPrice">
<xsl:with-param name="price" select="19.9"/>
<xsl:with-param name="symbol" select="'$'"/>
</xsl:call-template>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
全局参数示例
全局参数可以在样式表根节点下定义,在转换XML时从外部传入值:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 全局参数,默认语言为中文 -->
<xsl:param name="lang" select="'zh_CN'"/>
<xsl:template match="/">
<html>
<body>
<p>当前语言:<xsl:value-of select="$lang"/></p>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
使用注意事项
- 引用变量或参数时都需要加
$前缀,否则会被识别为节点名称。 - 变量和参数的名称需要符合XML命名规范,不能以数字开头,不能包含特殊字符。
- 如果不需要从外部传入值,优先使用
<xsl:variable>,避免不必要的参数传递逻辑。 - 同名变量和参数在不同作用范围内会遵循就近原则,优先使用当前作用范围内定义的版本。