【问题标题】:How to transform an XML file using XSLT in Python?如何在 Python 中使用 XSLT 转换 XML 文件?
【发布时间】:2013-05-17 22:16:16
【问题描述】:

美好的一天!需要在 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 xml xslt converter


    【解决方案1】:

    使用lxml

    import lxml.etree as ET
    
    dom = ET.parse(xml_filename)
    xslt = ET.parse(xsl_filename)
    transform = ET.XSLT(xslt)
    newdom = transform(dom)
    print(ET.tostring(newdom, pretty_print=True))
    

    【讨论】:

    • 您好,我还有一个问题。如果xml文件很大,“newdom = transform(dom)”的效率就很差了。我试图解析一个大的 xml 文件(>100MB),转换需要很长时间(>4 小时)。你对使用 python lxml 用 xslt 转换 xml 文件有什么好的建议吗?
    • 在底层,lxml 使用libxslt 来转换 XML。我不知道你能做些什么来加快这个速度。也许如果您在一个新问题中发布您的 XSLT,有人将能够提出改进建议。
    • 谢谢。我试过使用 write 没有运气。如何将内容写入文件?
    • @programiss 没有运气是什么意思? Etree.write(file, pretty_print) 是使用的方法。也许你传递了错误的论点?这是常见的错误。它应该是可写对象(例如文件或 sys.stdout 等),所以不仅仅是文件名字符串。
    【解决方案2】:

    LXML 是一个广泛使用的高性能库,用于基于 libxml2 和 libxslt 在 python 中进行 XML 处理 - 它包括 XSLT as well 的设施。

    【讨论】:

      【解决方案3】:

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

      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,您可以检查来自 Use saxon with python 的选项

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-11
        • 1970-01-01
        • 1970-01-01
        • 2019-05-30
        • 2021-12-22
        • 1970-01-01
        相关资源
        最近更新 更多