XSLT <xsl:template> 元素最全详解(2025 年最新版)
<xsl:template> 是 XSLT 中最核心、最常用的元素,没有之一。
所有转换逻辑几乎都靠它来实现。
一、基本语法(两种写法)
<!-- 写法1:最常用,基于匹配模式(推荐) -->
<xsl:template match="表达式">
<!-- 这里写当匹配到节点时要输出的内容 -->
</xsl:template>
<!-- 写法2:命名模板(像函数一样调用) -->
<xsl:template name="我的模板名">
<!-- 可以用 <xsl:call-template name="我的模板名"/> 来调用 -->
</xsl:template>
二、重要属性一览表(记住这 4 个就够 99% 场景)
| 属性 | 是否必填 | 说明 | 常见值举例 |
|---|---|---|---|
match | 选填 | 用 XPath 表达式匹配节点(模式匹配) | match="/"、match="book"、match="//item[@price>100]" |
name | 选填 | 给模板起个名字,之后可以调用 | name="header"、name="format-price" |
mode | 选填 | 同一节点用不同模式处理(防止冲突) | mode="toc"、mode="content" |
priority | 极少用 | 当多个模板都能匹配时,指定优先级(数字越大越优先) | priority="10" |
注意:match 和 name 不能同时出现在同一个 <xsl:template> 上(除非 XSLT 3.0 特殊情况)。
三、最常见 6 种用法(直接复制粘贴就能用)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 1. 匹配文档根节点(几乎所有 XSLT 都从这里开始) -->
<xsl:template match="/">
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
<!-- 2. 匹配所有 book 元素 -->
<xsl:template match="book">
<div class="book">
<xsl:apply-templates select="title"/>
<xsl:apply-templates select="author"/>
</div>
</xsl:template>
<!-- 3. 匹配 title 元素(并加粗显示) -->
<xsl:template match="title">
<h2><xsl:value-of select="."/></h2>
</xsl:template>
<!-- 4. 命名模板(像函数一样被调用) -->
<xsl:template name="page-footer">
<hr/>
<p style="text-align:center; color:gray;">
Copyright © 2025 · Generated by XSLT
</p>
</xsl:template>
<!-- 5. 使用 mode 实现同一节点不同处理(经典用法) -->
<xsl:template match="book" mode="list">
<li><xsl:value-of select="title"/> - <xsl:value-of select="author"/></li>
</xsl:template>
<xsl:template match="book" mode="detail">
<div class="card">
<h3><xsl:value-of select="title"/></h3>
<p>作者:<xsl:value-of select="author"/></p>
<p>价格:¥<xsl:value-of select="price"/></p>
</div>
</xsl:template>
<!-- 6. 匹配所有元素,啥也不干(用于调试或屏蔽输出) -->
<xsl:template match="*">
<!-- 什么都不输出 -->
</xsl:template>
</xsl:stylesheet>
四、如何调用模板
| 场景 | 写法 |
|---|---|
| 自动应用匹配的模板 | <xsl:apply-templates select="book"/> |
| 指定 mode | <xsl:apply-templates select="book" mode="detail"/> |
| 调用命名模板 | <xsl:call-template name="page-footer"/> |
| 带参数调用(XSLT 1.0) | “`xml |
#### 五、XSLT 内置默认模板(你一定要知道!)
即使你什么模板都不写,XSLT 也会自动帮你加上这两条“隐形模板”:
xml
这就是为什么你只写 `<xsl:apply-templates/>` 就能看到原始文本的原因。
#### 六、实战技巧(老手都在用)
1. **永远从 `match="/"` 开始**
这是标准写法,确保整个文档有根容器(如 `<html>`)。
2. **用 `mode` 解决冲突**
同一个 XML 要生成目录和正文时,必用 mode。
3. **用命名模板写可复用组件**
页眉、页脚、价格格式化、日期格式化等都写成命名模板。
4. **用优先级解决匹配冲突(极少用)**
xml
“`
七、一句话总结
<xsl:template>就是 XSLT 的“函数”:
你告诉它“当遇到某种节点时,就执行这里的代码”。
整个 XSLT 的威力,99% 都来自对<xsl:template>的巧妙使用。
需要我立刻帮你写一个包含多种 <xsl:template> 用法的完整可运行示例吗?
直接说你要实现什么效果(比如 XML 转 Bootstrap 卡片、转 Markdown、转 JSON),我 30 秒给你成品!