【问题标题】:lxml missing node when xslt transformxslt转换时lxml缺少节点
【发布时间】:2019-05-15 15:46:04
【问题描述】:

我有一个 XML 和 XSLT。来自法国的天气开放数据

XML : https://donneespubliques.meteofrance.fr/donnees_libres/Pdf/BRA/BRA.CHABLAIS.20190514130953.xml XSLT:http://donneespubliques.meteofrance.fr/donnees_libres/Pdf/BRA/bra.xslt

我在https://xslttest.appspot.com/ 网站上进行了测试,它似乎使用了http://saxon.sourceforge.net/,它给了我一个两个html 元素,link 和一个div

使用 lxml 它只给了我link 元素:

import requests
import lxml.etree as ET

xml = ET.fromstring(requests.get('https://donneespubliques.meteofrance.fr/donnees_libres/Pdf/BRA/BRA.CHABLAIS.20190514130953.xml').content)
xslt = ET.fromstring(requests.get('http://donneespubliques.meteofrance.fr/donnees_libres/Pdf/BRA/bra.xslt').content)
transform = ET.XSLT(xslt)
generated_html = transform(xml)
print(ET.tostring(generated_html, pretty_print=True))

输出:

b'<link rel="stylesheet" type="text/css" href="BRA.css"/>\n'

我感觉 XSLT 可能会生成两个没有根的 XML 元素,这可能是 lxml 只给我一个 link 元素的原因。

使用 lxml 4.3.3

【问题讨论】:

  • 如果你这样做str(generated_html)会发生什么?这是否显示了您期望的所有数据?文档 lxml.de/xpathxslt.html#xslt-result-objects 建议还有一个 .write_output() 您可以调用 generated_html 而通用 ET.tostring 方法可能不知道如何处理作为片段的 XSLT 结果。

标签: python xml python-3.x xslt lxml


【解决方案1】:

如果我使用str(generated_html)generated_html.write_output(sys.stdout),我会在Python 中使用lxml 获得完整的结果片段(尽管对于后者来说,xsl:output 中声明的编码似乎需要与标准输出的编码相匹配,在Windows 上它好像是UTF-8,其他平台不清楚)。

另请参阅https://lxml.de/xpathxslt.html#xslt-result-objects 警告

可以使用 .write() 方法(来自 ElementTree objects) 将 XSLT 结果序列化为文件,最好使用 .write_output() 方法。后者知道 标记并将预期数据写入输出文件。

所以我认为您假设生成的具有多个顶级元素的片段不适用于使用的 tostring 方法是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2013-04-23
    相关资源
    最近更新 更多