lxml отсутствует узел при преобразовании xslt - PullRequest
0 голосов
/ 15 мая 2019

У меня есть 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 Ответ

1 голос
/ 15 мая 2019

Я получаю полный фрагмент результата с lxml в Python, если я использую str(generated_html) или generated_html.write_output(sys.stdout) (хотя для работы последнего кажется, что кодировка, объявленная в xsl:output, должна соответствовать кодировке stdout, в Windows это похоже на UTF-8, не уверен насчет других платформ).

См. Также https://lxml.de/xpathxslt.html#xslt-result-objects предупреждение о том, что

можно использовать метод .write () (известный из ElementTree объекты), чтобы сериализовать результат XSLT в файл, лучше использовать метод .write_output (). Последний знает о пометить и записать ожидаемые данные в выходной файл.

Так что я думаю, что ваше предположение о том, что сгенерированный фрагмент с более чем одним элементом верхнего уровня не работает с использованным методом tostring, является правильным.

...