Kleines XML (oder SVG) und grosses XML gemeinsam in ein HTML transformieren

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()