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
方法配合使用是正确的。
我有一个 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
方法配合使用是正确的。