我有一个XML和XSLT。来自法国的天气opendata
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
答案 0 :(得分:1)
如果我使用str(generated_html)
或generated_html.write_output(sys.stdout)
,我会在Python中获得带有lxml的完整结果片段(尽管为了使后者工作,似乎xsl:output
中声明的编码需要与编码匹配)关于stdout,在Windows上似乎是UTF-8,不确定其他平台)。
另请参阅https://lxml.de/xpathxslt.html#xslt-result-objects警告
可以使用.write()方法(从ElementTree中知道 对象)以将XSLT结果序列化为文件,最好使用 .write_output()方法。后者知道 标记并将预期数据写入输出文件。
因此,我认为您的假设是,所生成的具有多个顶级元素的片段与使用的tostring
方法不能很好地配合。