在数据处理场景中,常需要将存储结构化数据的XML文件转换为适合页面展示的HTML格式,借助Python的lxml库配合XSLT规则可以高效实现这一需求,整个过程不需要手动解析XML节点再拼接HTML内容。

基础概念说明
XML是可扩展标记语言,用于存储和传输结构化数据,本身没有展示能力。XSLT是可扩展样式表转换语言,定义了XML到HTML的转换规则,能指定每个XML节点对应生成的HTML标签和样式。lxml是Python的高性能XML处理库,内置了XSLT转换的支持,不需要额外安装其他依赖。
准备工作
首先需要确保已经安装了lxml库,如果没有安装可以通过pip命令安装:
pip install lxml
接下来需要准备两个文件,一个是待转换的XML源文件,另一个是定义转换规则的XSLT样式文件。
XML源文件示例
假设我们有一个存储图书信息的XML文件,命名为books.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book category="编程">
<title>Python编程入门</title>
<author>张三</author>
<price>59.9</price>
</book>
<book category="文学">
<title>平凡的世界</title>
<author>路遥</author>
<price>39.8</price>
</book>
</bookstore>
XSLT样式文件示例
编写对应的XSLT文件,命名为books.xsl,规则是将bookstore下的所有book节点转换为HTML表格的行:
<?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>
<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>图书信息列表</h2>
<table>
<tr>
<th>分类</th>
<th>书名</th>
<th>作者</th>
<th>价格</th>
</tr>
<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>
使用lxml库实现转换
转换的核心逻辑是先用lxml解析XML和XSLT文件,再调用XSLT对象的转换方法生成最终的HTML内容,完整代码如下:
from lxml import etree
def xml_to_html(xml_path, xsl_path, output_path):
# 解析XML文件
xml_doc = etree.parse(xml_path)
# 解析XSLT样式文件
xsl_doc = etree.parse(xsl_path)
# 创建XSLT转换器
transform = etree.XSLT(xsl_doc)
# 执行转换
html_doc = transform(xml_doc)
# 将转换结果写入HTML文件
with open(output_path, 'wb') as f:
f.write(etree.tostring(html_doc, encoding='UTF-8', pretty_print=True))
print(f"转换完成,结果已保存到{output_path}")
if __name__ == "__main__":
# 调用转换函数,传入三个文件路径
xml_to_html("books.xml", "books.xsl", "books.html")
代码说明
etree.parse()方法用于解析XML或XSLT文件,返回对应的文档对象。etree.XSLT()接收XSLT文档对象,生成转换器实例。- 转换器实例可以直接调用,传入XML文档对象即可得到转换后的结果对象。
etree.tostring()将转换后的HTML对象转为字节流,再写入文件,指定pretty_print=True可以让生成的HTML有缩进,更易读。
常见问题处理
如果XML或XSLT文件存在语法错误,解析时会抛出XMLSyntaxError异常,可以在解析时添加异常处理:
from lxml import etree
from lxml.etree import XMLSyntaxError
try:
xml_doc = etree.parse("books.xml")
xsl_doc = etree.parse("books.xsl")
except XMLSyntaxError as e:
print(f"文件解析失败,错误信息:{e}")
exit(1)
如果XML文件中有命名空间,需要在XSLT中声明对应的命名空间,否则无法匹配到对应的节点。另外如果转换后的HTML需要兼容不同浏览器,可以在XSLT的head部分添加<meta charset="UTF-8">标签指定编码。
Pythonlxml库XSLTXML_to_HTML修改时间:2026-07-01 00:12:37