xslt 转换时 lxml 缺少节点

lxml missing node when xslt transform

我有一个 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/ which seems to use 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)generated_html.write_output(sys.stdout),我会在 Python 中得到带有 lxml 的完整结果片段(尽管后者工作似乎是在 [=12= 中声明的编码) ]需要匹配stdout的编码,在Windows上好像是UTF-8,其他平台不清楚)。

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

it is possible to use the .write() method (known from ElementTree objects) to serialise the XSLT result into a file, it is better to use the .write_output() method. The latter knows about the tag and writes the expected data into the output file.

所以我认为您的假设是,生成的具有多个顶级元素的片段不能很好地与使用的 tostring 方法配合使用是正确的。