XSLT全称是可扩展样式表转换语言,本身也是一种XML文档,专门用来把一种XML结构转换成另一种XML、HTML甚至纯文本。它的核心思想是声明式匹配:你写好若干模板,处理器在遍历源文档时,遇到符合规则的节点就套用对应模板,从而生成目标内容。这种方式比用程序循环解析再拼接字符串要稳妥,尤其适合固定格式的数据导出。

XSLT的基本组成
一个XSLT样式表通常以<xsl:stylesheet>为根元素,并声明版本与命名空间。里面最常见的是<xsl:template>模板,通过match属性指定要匹配的源节点路径。除此之外,<xsl:value-of>用来取节点文本,<xsl:for-each>用来遍历,<xsl:apply-templates>则把当前节点下的子节点继续交给其他模板处理。
理解XSLT要先分清两个概念:match和select。match写在template上,决定模板在什么时候被触发;select写在value-of或for-each上,决定从当前上下文抓取哪些节点。初学者常把两者弄混,导致取不到数据。下面用一段样式表展示图书列表的转换。
<?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></tr>
<xsl:for-each select="library/book">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="author"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
配套的XML源文档
上面样式表假设源数据长这样:根节点下有一个library,里面包含多本book,每本有title和author。XSLT处理器会把match="/"的模板作为入口,从根开始生成HTML表格。
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book>
<title>深入理解计算机系统</title>
<author>布莱恩特</author>
</book>
<book>
<title>代码整洁之道</title>
<author>马丁</author>
</book>
</library>
在程序中执行转换
实际项目里一般不用手写命令,而是在代码里调用转换引擎。以Java为例,可以用JDK自带的Transformer类加载xsl和xml,输出结果流。这样接口层收到旧格式XML后,能实时转成前端要的HTML片段。
import javax.xml.transform.*;
import javax.xml.transform.stream.StreamSource;
import java.io.File;
public class XsltDemo {
public static void main(String[] args) throws Exception {
TransformerFactory factory = TransformerFactory.newInstance();
// 加载样式表
Templates templates = factory.newTemplates(new StreamSource(new File("book.xsl")));
Transformer transformer = templates.newTransformer();
// 源XML与输出目标
StreamSource xmlSource = new StreamSource(new File("book.xml"));
javax.xml.transform.stream.StreamResult result =
new javax.xml.transform.stream.StreamResult(new File("out.html"));
transformer.transform(xmlSource, result);
System.out.println("转换完成");
}
}
这种写法的好处是样式与逻辑分离,以后改版式只需动XSLT文件。缺点是XSLT学习曲线略陡,复杂判断要用<xsl:choose>和<xsl:if>,嵌套深了不好读。对于特别大的文档,还要注意Transformer的内存占用。
常见误区与建议
有人以为XSLT能像正则表达式那样直接搜文本,其实它操作的是节点树,定位靠XPath。比如想取第二个book要用select="library/book[2]",而不是靠字符偏移。另外,输出HTML时记得在stylesheet加output方法声明,避免自带XML头影响浏览器解析。
<xsl:output method="html" encoding="UTF-8" indent="yes"/>
总体来看,XSLT适合结构稳定、转换规则明确的场景,比如报文适配、报表生成。若业务逻辑频繁变动且分支很多,用通用编程语言直接写映射可能更直观。掌握XSLT能让你在处理老旧系统XML对接时多一件省心工具。