XSLT模板是实现XML文档转换的核心单元,通过定义不同的模板可以匹配XML中的各类节点,完成数据提取、格式转换等操作。for-each循环则是XSLT中用于遍历节点集合的重要语法,能够批量处理同类型的多个节点数据。

XSLT模板的基础写法
模板的基本结构
XSLT模板使用<xsl:template>标签定义,核心属性是match,用于指定模板匹配的XML节点路径。一个完整的XSLT文件需要先声明XSLT命名空间,再定义对应的模板内容。
基础的XSLT模板结构示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 匹配根节点的模板 -->
<xsl:template match="/">
<html>
<body>
<h1>XML数据转换结果</h1>
<!-- 调用其他模板或处理节点 -->
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
模板的匹配规则
match属性支持XPath语法,常见的匹配方式包括:
- 匹配根节点:
match="/" - 匹配指定元素:
match="book"匹配所有book元素 - 匹配子元素:
match="book/title"匹配book元素下的title子元素 - 匹配带属性的元素:
match="book[@category='web']"匹配category属性为web的book元素
模板的调用
在模板中可以使用<xsl:apply-templates>标签调用其他匹配对应节点的模板,也可以指定select属性来选择要处理的节点集合。
XSLT for-each循环用法
for-each的基本语法
for-each循环使用<xsl:for-each>标签定义,通过select属性指定要遍历的节点集合,循环体内部可以对每个节点进行处理。
基本语法格式如下:
<xsl:for-each select="节点路径">
<!-- 循环处理逻辑,可以使用xsl:value-of提取当前节点的内容 -->
<xsl:value-of select="子节点名称"/>
</xsl:for-each>
for-each循环示例
假设我们有以下XML数据文件:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="web">
<title>XSLT入门教程</title>
<author>张三</author>
<price>59.9</price>
</book>
<book category="programming">
<title>Java核心技术</title>
<author>李四</author>
<price>89.9</price>
</book>
<book category="web">
<title>XML高级应用</title>
<author>王五</author>
<price>69.9</price>
</book>
</bookstore>
我们需要遍历所有book元素,输出每本书的标题、作者和价格,对应的XSLT模板可以这样写:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>书店书籍列表</h2>
<table border="1">
<tr>
<th>标题</th>
<th>作者</th>
<th>价格</th>
</tr>
<!-- 遍历所有book节点 -->
<xsl:for-each select="bookstore/book">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="author"/></td>
<td><xsl:value-of select="price"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
for-each中的排序操作
可以在for-each循环中添加<xsl:sort>标签对遍历的节点进行排序,默认是升序排列,也可以通过order属性指定升序ascending或降序descending。
比如按照价格降序排列书籍列表,修改for-each部分如下:
<xsl:for-each select="bookstore/book">
<!-- 按照price子元素的值降序排序 -->
<xsl:sort select="price" order="descending"/>
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="author"/></td>
<td><xsl:value-of select="price"/></td>
</tr>
</xsl:for-each>
常见问题说明
1. 模板没有生效:检查match属性的XPath路径是否正确,是否和被转换的XML节点匹配。
2. for-each循环没有遍历到数据:检查select属性的节点路径是否正确,XML中是否存在对应的节点。
3. 输出内容为空:检查<xsl:value-of>的select路径是否正确,是否对应到当前节点的子元素。
注意:XSLT的版本不同可能存在语法差异,本文示例基于XSLT 1.0版本,大部分场景都兼容,若使用更高版本可以根据对应规范调整语法。
XSLT模板XSLT_for-eachXML转换XSLT循环修改时间:2026-06-11 17:36:40