XSLT是可扩展样式表转换语言的简称,它可以通过定义转换规则,将XML文档的内容按照指定格式输出为HTML、其他XML或者文本等类型。在实际开发中,当我们有结构化的XML数据需要生成网页展示时,使用XSLT是最直接的解决方案之一。

XSLT转换的核心原理
XSLT转换过程需要三个核心部分:原始的XML源文件、定义转换规则的XSLT样式表文件,以及执行转换的解析器。解析器会读取XSLT中定义的模板规则,匹配XML中的对应节点,然后将节点的内容按照规则输出为HTML标签和内容。
基础转换示例准备
我们首先准备一个简单的XML源文件,存储一些书籍信息,后续会用XSLT将其转换为HTML表格展示。
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="编程">
<title>XSLT实战指南</title>
<author>张三</author>
<price>59.9</price>
</book>
<book category="文学">
<title>散文精选</title>
<author>李四</author>
<price>39.8</price>
</book>
</bookstore>
编写XSLT样式表
XSLT文件本身也是符合XML规范的文档,需要以<?xml?>声明开头,根元素是<xsl:stylesheet>,同时需要声明XSLT的命名空间。
基础XSLT结构
下面是一个能将上述XML转换为HTML页面的XSLT示例,它会生成一个包含书籍列表的HTML表格。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 输出格式设置为HTML -->
<xsl:output method="html" encoding="UTF-8"/>
<!-- 匹配XML根节点的模板 -->
<xsl:template match="/">
<html>
<head>
<title>书籍列表</title>
<style>
table { border-collapse: collapse; width: 80%; margin: 20px auto; }
th, td { border: 1px solid #ccc; padding: 8px; text-align: center; }
th { background-color: #f5f5f5; }
</style>
</head>
<body>
<h2 style="text-align: center;">书店书籍列表</h2>
<table>
<tr>
<th>分类</th>
<th>书名</th>
<th>作者</th>
<th>价格</th>
</tr>
<!-- 循环匹配所有book节点 -->
<xsl:for-each select="bookstore/book">
<tr>
<td><xsl:value-of select="@category"/></td>
<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>
执行XSLT转换的方法
编写好XML和XSLT文件后,需要通过解析器执行转换,常见的执行方式有两种,分别是浏览器端转换和服务器端转换。
浏览器端转换
现代浏览器原生支持XSLT转换,只需要在XML文件开头添加<?xml-stylesheet?>处理指令,指向XSLT文件的路径即可。
修改之前的XML文件,添加样式表引用:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="book.xsl"?>
<bookstore>
<book category="编程">
<title>XSLT实战指南</title>
<author>张三</author>
<price>59.9</price>
</book>
<book category="文学">
<title>散文精选</title>
<author>李四</author>
<price>39.8</price>
</book>
</bookstore>
将XML和XSLT文件放在同一目录下,用浏览器打开XML文件,就会自动渲染出转换后的HTML页面。
服务器端转换
如果需要在服务器端完成转换,可以使用对应编程语言的XSLT解析库,以Python为例,使用lxml库实现转换:
from lxml import etree
# 加载XML源文件
xml_tree = etree.parse("book.xml")
# 加载XSLT样式表
xslt_tree = etree.parse("book.xsl")
# 创建转换器
transformer = etree.XSLT(xslt_tree)
# 执行转换
result = transformer(xml_tree)
# 输出转换后的HTML内容
print(str(result))
# 也可以保存到HTML文件
with open("book.html", "w", encoding="utf-8") as f:
f.write(str(result))
常用XSLT语法说明
在实际转换过程中,除了基础的<xsl:for-each>和<xsl:value-of>,还有一些常用语法需要掌握:
- <xsl:template>:定义转换模板,通过match属性指定匹配的XML节点路径
- <xsl:apply-templates>:应用匹配当前节点子节点的模板,实现模板的递归调用
- <xsl:if>:条件判断,通过test属性设置判断条件,满足条件才输出内容
- <xsl:sort>:排序,可放在<xsl:for-each>内部,对循环的内容进行排序
比如我们需要对书籍按价格从高到低排序,可以修改XSLT中的循环部分:
<xsl:for-each select="bookstore/book">
<!-- 按price节点的值降序排序 -->
<xsl:sort select="price" data-type="number" order="descending"/>
<tr>
<td><xsl:value-of select="@category"/></td>
<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>
注意事项
在使用XSLT转换XML为HTML时,需要注意几个常见问题:
- XSLT文件必须符合XML规范,所有标签都需要正确闭合,属性值需要用引号包裹
- 如果XML中包含特殊字符,比如<、&等,需要先进行转义,否则会导致解析错误
- 不同浏览器的XSLT支持程度略有差异,如果需要兼容旧浏览器,建议优先使用服务器端转换的方式
- XSLT的版本选择,1.0版本兼容性最好,大部分解析器都支持,2.0和3.0版本功能更丰富,但部分环境可能不支持