如何在Python中使用XSLT转换XML文件?

如何在Python中使用XSLT转换XML文件?,python,xml,xslt,converter,Python,Xml,Xslt,Converter,你好!需要在Python中使用xslt转换xml。我有一个php的示例代码 如何在Python中实现这一点,或者在哪里可以找到类似的东西?谢谢大家! $xmlFileName = dirname(__FILE__)."example.fb2"; $xml = new DOMDocument(); $xml->load($xmlFileName); $xslFileName = dirname(__FILE__)."example.xsl"; $xsl = new DOMDocument;

你好!需要在Python中使用xslt转换xml。我有一个php的示例代码

如何在Python中实现这一点,或者在哪里可以找到类似的东西?谢谢大家!

$xmlFileName = dirname(__FILE__)."example.fb2";
$xml = new DOMDocument();
$xml->load($xmlFileName);

$xslFileName = dirname(__FILE__)."example.xsl";
$xsl = new DOMDocument;
$xsl->load($xslFileName);

// Configure the transformer
$proc = new XSLTProcessor();
$proc->importStyleSheet($xsl); // attach the xsl rules
echo $proc->transformToXML($xml);
是一个在python中广泛使用的基于libxml2和libxslt的XML处理高性能库-它包括使用


最好的方法是使用lxml,但它只支持XSLT1

import os
import lxml.etree as ET

inputpath = "D:\\temp\\"
xsltfile = "D:\\temp\\test.xsl"
outpath = "D:\\output"


for dirpath, dirnames, filenames in os.walk(inputpath):
            for filename in filenames:
                if filename.endswith(('.xml', '.txt')):
                    dom = ET.parse(inputpath + filename)
                    xslt = ET.parse(xsltfile)
                    transform = ET.XSLT(xslt)
                    newdom = transform(dom)
                    infile = unicode((ET.tostring(newdom, pretty_print=True)))
                    outfile = open(outpath + "\\" + filename, 'a')
                    outfile.write(infile)

要使用XSLT 2,您可以从

Hello中检查选项,这里我还有一个问题。如果xml文件很大,“newdom=transform(dom)”的效率非常差。我试图解析一个大的xml文件(>100MB),转换需要花费很长时间(>4小时)。关于使用python lxml使用xslt转换xml文件,您有什么好的建议吗?实际上,lxml是用来转换xml的。我不知道你能做些什么来加快速度。如果您在新问题中发布XSLT,可能会有人提出改进建议。谢谢。我尝试过使用write,但运气不好。如何将内容写入文件?@programiss你的意思是没有运气?write(file,pretty_print)是使用的方法。也许你说错了?这是常见的错误。它应该是可写对象(例如file或sys.stdout等),所以不仅仅是文件名字符串。
import os
import lxml.etree as ET

inputpath = "D:\\temp\\"
xsltfile = "D:\\temp\\test.xsl"
outpath = "D:\\output"


for dirpath, dirnames, filenames in os.walk(inputpath):
            for filename in filenames:
                if filename.endswith(('.xml', '.txt')):
                    dom = ET.parse(inputpath + filename)
                    xslt = ET.parse(xsltfile)
                    transform = ET.XSLT(xslt)
                    newdom = transform(dom)
                    infile = unicode((ET.tostring(newdom, pretty_print=True)))
                    outfile = open(outpath + "\\" + filename, 'a')
                    outfile.write(infile)