XSLT变量和参数是实现XML动态转换的重要工具,变量用于存储临时数据,参数用于接收外部传入的值,二者都能有效减少重复代码,提升转换逻辑的灵活性。合理使用变量和参数可以让XSLT样式表适配更多不同的转换场景。

XSLT变量的定义与使用
变量的定义语法
XSLT中使用<xsl:variable>标签定义变量,基本语法如下:
<xsl:variable name="变量名" select="表达式"/>
<!-- 或者带内容的变量定义 -->
<xsl:variable name="变量名">
变量内容
</xsl:variable>
变量名需要符合XML命名规范,不能以数字开头,不能包含空格和特殊字符。select属性用于直接给变量赋值,赋值的来源可以是XML节点、字符串、数字或者XPath表达式的计算结果。
变量的作用域
XSLT变量是只读的,定义之后不能修改值,作用域遵循就近原则:
- 在样式表根节点定义的变量是全局变量,整个样式表都能访问
- 在模板内部定义的变量是局部变量,只能在当前模板内使用
- 内层作用域可以访问外层作用域的变量,外层不能访问内层的变量
变量使用示例
假设我们有如下的XML源文件,存储了学生的成绩信息:
<students>
<student>
<name>张三</name>
<score>92</score>
</student>
<student>
<name>李四</name>
<score>85</score>
</student>
</students>
下面的XSLT样式表定义了全局变量和局部变量,计算所有学生的平均分:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 全局变量:定义及格分数线 -->
<xsl:variable name="pass_score" select="60"/>
<xsl:template match="/">
<html>
<body>
<h3>学生成绩统计</h3>
<!-- 局部变量:计算总分 -->
<xsl:variable name="total_score" select="sum(students/student/score)"/>
<!-- 局部变量:计算学生数量 -->
<xsl:variable name="student_count" select="count(students/student)"/>
<p>及格分数线:<xsl:value-of select="$pass_score"/></p>
<p>总分:<xsl:value-of select="$total_score"/></p>
<p>学生数量:<xsl:value-of select="$student_count"/></p>
<p>平均分:<xsl:value-of select="$total_score div $student_count"/></p>
<h4>学生明细</h4>
<ul>
<xsl:apply-templates select="students/student"/>
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="student">
<li>
<xsl:value-of select="name"/>:<xsl:value-of select="score"/>分
<xsl:if test="score >= $pass_score">(及格)</xsl:if>
<xsl:if test="score < $pass_score">(不及格)</xsl:if>
</li>
</xsl:template>
</xsl:stylesheet>
XSLT参数的定义与使用
参数的定义语法
XSLT中使用<xsl:param>标签定义参数,语法和变量类似:
<xsl:param name="参数名" select="默认值"/>
<!-- 或者带默认内容的参数定义 -->
<xsl:param name="参数名">
默认内容
</xsl:param>
参数和变量的核心区别是参数可以接收外部传入的值,如果没有传入值则使用默认值。select属性用于设置参数的默认值,如果不需要默认值可以省略该属性。
参数的传参方式
参数可以在两个场景传递:
- 调用模板时传参:使用
<xsl:with-param>标签给被调用的模板传递参数 - 转换入口传参:在执行XSLT转换时,从外部程序传入参数值,比如Java、Python的XSLT转换库都支持传入参数
参数使用示例
下面修改之前的样式表,添加一个参数用于指定是否只显示及格的学生:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 全局参数:是否只显示及格学生,默认值为false -->
<xsl:param name="show_pass_only" select="false()"/>
<xsl:template match="/">
<html>
<body>
<h3>学生成绩列表</h3>
<ul>
<xsl:choose>
<xsl:when test="$show_pass_only">
<!-- 只显示及格学生 -->
<xsl:apply-templates select="students/student[score >= 60]"/>
</xsl:when>
<xsl:otherwise>
<!-- 显示所有学生 -->
<xsl:apply-templates select="students/student"/>
</xsl:otherwise>
</xsl:choose>
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="student">
<li>
<xsl:value-of select="name"/>:<xsl:value-of select="score"/>分
</li>
</xsl:template>
</xsl:stylesheet>
如果执行转换时传入参数show_pass_only的值为true(),则只会输出成绩大于等于60的学生信息,不传参则默认显示所有学生。
变量和参数的注意事项
- XSLT变量和参数都是只读的,定义之后不能修改值,如果需要动态变化的数据,需要重新定义新的变量
- 变量和参数的引用都需要加
$前缀,比如$变量名、$参数名 - 参数如果没有设置默认值,又没有传入对应的值,那么参数的值为空节点集
- 局部变量和参数的优先级高于同名的全局变量和参数,内层作用域的定义会覆盖外层的同名定义
XSLTvariableparamxsl_transform修改时间:2026-06-20 10:42:36