Hintergrund meiner Aktion ist, der Versuch ein XML in HTML zu rendern.
Folgende Dateien sind in dem Prozess involviert:
- ein XML, das die variablen Inhalte, die zum Rendering benötigt werden enthält
- ein XSL, das die Template-Informationen und statischen Inhalte beinhaltet
- ein SVG, das separat erzeugt wird und ebenfalls beim Rendering herangezogen wird.
verwendet wird hierzu lxml.etree
:
import lxml.etree as ET
Zunächst werden alle 3 Files geparst.
content_xml = ET.parse(BytesIO(xml.bytes()))
qrimage = ET.parse('/ein/pfad/zum/file/qrcode.svg')
xslt = ET.parse('/ein/pfad/zum/file/rechnung.xsl')
Die Transformation wird vorbereitet, indem das XSL ,hier die Variable xslt
, der XSLT
Funktion von lxml.etree
übergeben wird :
transform = ET.XSLT(xslt)
Dann wird das Dokument newdom
transformiert, mit content_xml
sowie zwei Parametern, die vorab im Python berechnet wurden und dann im XSL per <xsl:value-of select="$current_date"/>
verwendet werden können.
newdom = transform(content_xml, current_year=ET.XSLT.strparam("2021"), current_date=ET.XSLT.strparam(date.today().strftime("%d.%m.%Y"),))
Im Anschluss wird aus dem neuen Dokument, der Container qr_bill
herausgesucht, in den das SVG integriert werden soll. Über append
wird das svg, das der Variable qrimage
liegt in das HTML eingefügt. Eine leere html-Datei wird als rechnung.html
erzeugt und dann mit dem html-String befüllt.
newdom.find("//div[@id='qr_bill']").append(qrimage.getroot())
html_string = ET.tostring(newdom, pretty_print=True).decode("utf-8")
html_file= open("rechnung.html","w")
html_file.write(html_string)
html_file.close()