xslt转换时lxml缺少节点

时间:2019-05-15 15:46:04

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

我有一个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

1 个答案:

答案 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方法不能很好地配合。