XSLT中可以通过
XSLT参数传递的核心标签
XSLT的参数传递依赖两个核心标签,分别是用于定义参数的<xsl:param>和用于传递参数的<xsl:with-param>,二者的作用和使用场景有明确区分。
1. <xsl:param>定义参数
<xsl:param>用于在模板内部定义参数,既可以给参数设置默认值,也可以不设置,当没有传递对应参数时就会使用默认值。该标签可以放在<xsl:template>标签的开头位置,作为模板的入参定义。
2. <xsl:with-param>传递参数
<xsl:with-param>用于调用模板时传递参数,需要和<xsl:apply-templates>或者<xsl:call-template>标签配合使用,标签的name属性需要和<xsl:param>定义的参数名保持一致,才能正确传递参数值。
参数传递的具体实现步骤
参数传递的完整流程分为三步:首先定义被调用模板的参数,其次在调用模板的位置传递参数,最后在被调用模板中使用参数。下面通过完整示例展示整个过程。
示例XML源文件
假设我们有一个简单的XML文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="编程">
<title>XSLT入门教程</title>
<price>59.9</price>
</book>
<book category="文学">
<title>散文精选</title>
<price>39.9</price>
</book>
</bookstore>
定义带参数的XSLT模板
我们定义一个处理单本书籍的模板,通过参数控制是否显示价格,以及显示的价格前缀:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 匹配根节点,遍历所有book节点 -->
<xsl:template match="/">
<html>
<body>
<h2>书籍列表</h2>
<xsl:apply-templates select="bookstore/book"/>
</body>
</html>
</xsl:template>
<!-- 处理book节点的模板,定义两个参数 -->
<xsl:template match="book">
<!-- 定义参数showPrice,默认值为yes,控制是否显示价格 -->
<xsl:param name="showPrice">yes</xsl:param>
<!-- 定义参数pricePrefix,默认值为空,作为价格的前缀 -->
<xsl:param name="pricePrefix"></xsl:param>
<p>
书名:<xsl:value-of select="title"/>
<!-- 判断是否显示价格 -->
<xsl:if test="$showPrice = 'yes'">
,价格:<xsl:value-of select="$pricePrefix"/><xsl:value-of select="price"/>元
</xsl:if>
</p>
</xsl:template>
</xsl:stylesheet>
调用模板时传递参数
修改根模板的<xsl:apply-templates>部分,给不同的book节点传递不同的参数:
<xsl:template match="/">
<html>
<body>
<h2>书籍列表</h2>
<!-- 给第一本书传递参数,不显示价格 -->
<xsl:apply-templates select="bookstore/book[1]">
<xsl:with-param name="showPrice">no</xsl:with-param>
</xsl:apply-templates>
<!-- 给第二本书传递参数,显示价格,前缀为"售价:" -->
<xsl:apply-templates select="bookstore/book[2]">
<xsl:with-param name="showPrice">yes</xsl:with-param>
<xsl:with-param name="pricePrefix">售价:</xsl:with-param>
</xsl:apply-templates>
</body>
</html>
</xsl:template>
转换后的结果
上述XSLT转换后的HTML结果如下:
<html>
<body>
<h2>书籍列表</h2>
<p>书名:XSLT入门教程</p>
<p>书名:散文精选,价格:售价:39.9元</p>
</body>
</html>
参数传递的注意事项
- 参数名区分大小写,<xsl:with-param>的name属性必须和<xsl:param>定义的参数名完全一致,否则参数无法正确传递。
- 如果<xsl:param>设置了默认值,而调用时没有传递该参数,那么模板会使用默认值,不会报错。
- 参数的值可以是静态文本,也可以是XPath表达式,比如可以通过<xsl:value-of>获取其他节点的值作为参数传递。
- 参数作用域仅限于定义它的模板内部,不同模板的参数互不影响,即使参数名相同也不会冲突。
使用<xsl:call-template>传递参数
除了<xsl:apply-templates>,<xsl:call-template>也可以用来调用命名模板并传递参数,示例如下:
<!-- 定义命名模板 -->
<xsl:template name="formatPrice">
<xsl:param name="price"/>
<xsl:param name="unit">元</xsl:param>
价格:<xsl:value-of select="$price"/><xsl:value-of select="$unit"/>
</xsl:template>
<!-- 调用命名模板传递参数 -->
<xsl:template match="book">
<p>书名:<xsl:value-of select="title"/>,<xsl:call-template name="formatPrice">
<xsl:with-param name="price"><xsl:value-of select="price"/></xsl:with-param>
<xsl:with-param name="unit">人民币</xsl:with-param>
</xsl:call-template></p>
</xsl:template>
XSLT模板参数参数传递XSLT_template修改时间:2026-06-19 03:03:48