XSLT变量和参数怎么定义使用?

来源:语言推理作者:重启一下头衔:草根站长
导读:本期聚焦于小伙伴创作的《XSLT变量和参数怎么定义使用?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《XSLT变量和参数怎么定义使用?》有用,将其分享出去将是对创作者最好的鼓励。

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

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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。