Auf dieser Seite
- Visualisierung ist keine Konvertierung
- Die Ausgangslage: zwei Syntaxen, ein semantisches Modell
- KoSIT-Visualisierungs-XSLT: zweistufiges Rendering
- Stufe 1: Normalisierung (Format-Zweig → XR-Zwischenmodell)
- Stufe 2: Rendering (XR-Zwischenmodell → Ausgabe)
- Saxon-JS: XSLT 3.0 im Browser
- Build-Schritt: .xsl → .sef.json
- Ablauf im Browser (vereinfacht)
- ZUGFeRD: Extraktion des eingebetteten XML aus dem PDF
- Dateiart-Erkennung: PDF oder XML?
- Extraktion mit PDF.js
- Erweiterter Ablauf für ZUGFeRD-Eingaben
- UBL vs. CII: wo sich Renderprobleme zeigen
- GoBD und das Sichtdokument
- Was das BMF-Schreiben vom 14. Juli 2025 festlegt
- Einbindung in Portal- und Workflow-Systeme
- Was XRechnung 4.0 für bestehende Viewer-Stacks bedeutet
- Weiterführende Ressourcen
- Vom Viewer zur Liquiditätsplanung
Dieser Artikel richtet sich an ERP-Berater, IT-Verantwortliche und Steuerberater, die verstehen wollen, wie aus einer eingehenden XRechnung-XML eine menschenlesbare Ansicht entsteht – vollständig im Browser, ohne Server-Roundtrip – und was das für die GoBD-konforme Archivierung bedeutet. Den kaufmännischen Einstieg liefert die Viewer-Übersicht.
Visualisierung ist keine Konvertierung
Ein häufiges Missverständnis: wer eine XRechnung „als PDF speichert", glaubt manchmal, das Original ersetzt zu haben. Das Gegenteil ist richtig.
Visualisierung bedeutet: das strukturierte XML wird für einen Menschen lesbar gemacht – dieselben Daten, andere Darstellung. Die semantischen Felder (BT-1 Rechnungsnummer, BT-9 Fälligkeitsdatum, BG-25 Positionszeilen) erscheinen als layoutierte Ansicht statt als Markup. Das Quelldokument bleibt unverändert.
Konvertierung würde bedeuten: ein Format wird in ein anderes überführt, das gleichwertig oder original ist. Das trifft auf eine gerenderte HTML- oder PDF-Ansicht ausdrücklich nicht zu. Die Ansicht ist eine abgeleitete Arbeitskopie, kein rechtsverbindliches Dokument.
Diese Unterscheidung ist nicht akademisch: Sie bestimmt, was GoBD-pflichtig archiviert werden muss und was nicht (dazu weiter unten).
Die Ausgangslage: zwei Syntaxen, ein semantisches Modell
XRechnung erklärt beschreibt die Grundstruktur. Für die Visualisierung ist entscheidend: XRechnung liegt in zwei Syntaxvarianten vor, die strukturell verschieden sind.
| Merkmal | UBL 2.1 (OASIS) | UN/CEFACT CII D16B |
|---|---|---|
| Root-Element | <Invoice> | <CrossIndustryInvoice> |
| Namespace-Präfixe | cbc, cac | ram, rsm, udt |
| Rechnungsnummer | cbc:ID direkt unter Root | rsm:ExchangedDocument/ram:ID |
| Belegdatum | cbc:IssueDate | ram:IssueDateTime/udt:DateTimeString |
| ZUGFeRD/Factur-X | nicht vorgesehen | ausschließlich CII |
| Peppol BIS Billing 3.0 | verpflichtend | nicht gefordert |
Ein Viewer, der nur UBL kennt, schlägt bei CII fehl – und umgekehrt. Ein robuster Stack muss beide Syntaxen erkennen und korrekt verarbeiten. Die Syntax-Erkennung erfolgt zuverlässig anhand des Root-Namespace: urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 für UBL, urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100 für CII.
ZUGFeRD und Factur-X verwenden ausschließlich CII – ein Viewer für eingehende hybride ZUGFeRD-PDFs muss daher zwingend den CII-Pfad beherrschen.
KoSIT-Visualisierungs-XSLT: zweistufiges Rendering
Die Koordinierungsstelle für IT-Standards (KoSIT) stellt unter Apache 2.0 ein XSLT-Paket bereit, das den Industriestandard für die XRechnung-Visualisierung in Deutschland darstellt. Das aktuelle Release 2026-01-31 ist kompatibel mit XRechnung 3.0.x.
Stufe 1: Normalisierung (Format-Zweig → XR-Zwischenmodell)
Die erste Transformationsstufe gleicht die strukturellen Unterschiede zwischen UBL und CII aus:
ubl-invoice-xr.xslüberführt UBL-Eingaben in das XR-Zwischenmodellcii-xr.xslüberführt CII-Eingaben in dasselbe Zwischenmodell
Das XR-Zwischenmodell ist eine syntax-neutrale Zwischenrepräsentation: alle semantischen Felder sind in einem einheitlichen XML-Vokabular verfügbar, unabhängig davon, ob die Eingabe UBL oder CII war.
Stufe 2: Rendering (XR-Zwischenmodell → Ausgabe)
Auf das Zwischenmodell wird anschließend eines der Ausgabe-Stylesheets angewendet:
xrechnung-html.xsl→ HTML-Ansicht (für Browser-Darstellung und Druck)xr-pdf.xsl→ PDF-Rendering (für serverseitige Ausgabe)
Die Zweistufigkeit hat einen technischen Vorteil: Fehler in der Syntax-Normalisierung und Fehler im Layout sind klar trennbar. Wer das Rendering anpassen will (Firmenlogo, abweichende Spaltenanordnung), greift ausschließlich in Stufe 2 ein, ohne Stufe 1 anfassen zu müssen.
Saxon-JS: XSLT 3.0 im Browser
Serverseitige XSLT-Verarbeitung (Saxon-HE/EE in Java oder .NET) ist für Backend-Systeme der Standardweg. Für einen Browser-basierten Viewer ist dieser Weg nicht gangbar – ein Upload auf einen Verarbeitungsserver würde die Rechnungsdaten das Gerät verlassen lassen.
Saxon-JS 2.7 löst das: Es ist eine XSLT-3.0-Implementierung in JavaScript, die vollständig im Browser ausgeführt wird. Die KoSIT-Stylesheets laufen damit client-seitig – keine Serververbindung, kein Upload.
Build-Schritt: .xsl → .sef.json
Saxon-JS verwendet kein rohes .xsl zur Laufzeit. Im Build-Prozess werden die Stylesheets mit dem Saxon-EE-Compiler in ein compiled stylesheet format (.sef.json) überführt:
Compile-Zeit (Node.js / Ant):
ubl-invoice-xr.xsl → ubl-invoice-xr.sef.json
cii-xr.xsl → cii-xr.sef.json
xrechnung-html.xsl → xrechnung-html.sef.json
Die .sef.json-Dateien werden statisch ausgeliefert. Im Browser lädt Saxon-JS die passende .sef.json per fetch, führt die Transformation gegen das eingelesene XML aus und schreibt das Ergebnis-HTML in den DOM.
Bundlegröße: Das Saxon-JS-Paket hat unkomprimiert eine Größe von ca. 2,3 MB. Gzip- oder Brotli-Komprimierung im HTTP-Layer ist Pflicht; nach Komprimierung liegen die tatsächlich übertragenen Daten deutlich darunter. Die .sef.json-Dateien sind deutlich kleiner.
Ablauf im Browser (vereinfacht)
1. Nutzer wählt XML-Datei
2. FileReader liest Datei lokal (kein Upload)
3. Root-Namespace-Erkennung → UBL oder CII
4. Saxon-JS lädt passende sef.json (Stufe 1)
5. Transformation → XR-Zwischenmodell
6. Saxon-JS lädt xrechnung-html.sef.json (Stufe 2)
7. Transformation → HTML
8. HTML wird im Browser gerendert
Der gesamte Vorgang läuft im Browser-Thread; die XML-Datei verlässt zu keinem Zeitpunkt das Gerät des Nutzers.
ZUGFeRD: Extraktion des eingebetteten XML aus dem PDF
ZUGFeRD-Dateien sind reguläre PDFs mit einem eingebetteten XML-Anhang – kein reines XML. Bevor der XSLT-Stack greifen kann, muss dieser Anhang aus der PDF-Hülle herausgelöst werden.
Dateiart-Erkennung: PDF oder XML?
Der Viewer prüft zuerst, womit er es zu tun hat. Eingaben mit MIME-Typ application/pdf oder Dateiendung .pdf starten den ZUGFeRD-Extraktionspfad; Eingaben mit .xml landen direkt bei der Root-Namespace-Erkennung (UBL oder CII).
Extraktion mit PDF.js
Die Extraktion des eingebetteten XML erfolgt über PDF.js (Mozilla, Apache 2.0) – die verbreitete JavaScript-Bibliothek für PDF-Verarbeitung im Browser. PDF.js kann auf eingebettete Dateianhänge (EmbeddedFiles) zugreifen, ohne die PDF-Datei serverseitig zu übermitteln.
ZUGFeRD-konforme PDFs tragen den XML-Anhang unter einem von zwei Standardnamen:
factur-x.xml– Factur-X und ZUGFeRD 2.xzugferd-invoice.xml– älteres ZUGFeRD-1.0-Schema (heute selten)
PDF.js gibt den Anhang als ArrayBuffer zurück; dieser wird als UTF-8-String dekodiert und dem XSLT-Stack übergeben. Ab diesem Punkt ist der Verarbeitungspfad identisch mit dem für reine XRechnung-XML.
Erweiterter Ablauf für ZUGFeRD-Eingaben
1. Nutzer wählt PDF-Datei (ZUGFeRD)
2. FileReader liest Datei lokal (kein Upload)
3. Dateiart-Erkennung → PDF → ZUGFeRD-Pfad
4. PDF.js extrahiert eingebetteten XML-Anhang (factur-x.xml)
5. ArrayBuffer → UTF-8-String
6. Root-Namespace-Erkennung → CII (ZUGFeRD ausschließlich CII)
7. Saxon-JS 2.7 lädt cii-xr.sef.json (Stufe 1)
8. Transformation → XR-Zwischenmodell
9. Saxon-JS 2.7 lädt xrechnung-html.sef.json (Stufe 2)
10. Transformation → HTML
11. HTML wird im Browser gerendert
Das eingebettete PDF-Bild (der menschenlesbare Teil des ZUGFeRD-Dokuments) bleibt dabei ungenutzt – der Viewer arbeitet ausschließlich mit dem extrahierten CII-XML.
UBL vs. CII: wo sich Renderprobleme zeigen
Die meisten Felder sind in beiden Syntaxen äquivalent abgebildet. Einige Stellen erfordern dennoch Aufmerksamkeit bei der Implementierung:
Positionsebene (BG-25 Invoice line): UBL-Positionen liegen in cac:InvoiceLine-Elementen; CII-Positionen in ram:IncludedSupplyChainTradeLineItem. Unterpositionszeilen (Sub-Invoice-Lines) werden in CII anders strukturiert als in UBL – die KoSIT-Stylesheets haben für diesen Fall in Release 2026-01-31 Korrekturen erhalten.
Datum-Formate: CII kodiert Datumsfelder mit einem Qualifikator (format="102" für YYYYMMDD), UBL verwendet ISO-8601-Strings direkt. Falsches Parsing hier führt zu unlesbaren Datumswerten im Sichtdokument.
Steuerzusammenfassung (BG-23): Die Steueraufschlüsselung nach Steuerkategorie liegt in beiden Syntaxen auf ähnlicher Ebene, aber mit unterschiedlichen Element-Tiefen. Rendering-Fehler zeigen sich hier typischerweise als leere Steuerblöcke oder falsch summierte Beträge.
Zahlungsmittel (BG-16): SEPA-Bankverbindung (BT-84 IBAN) und Zahlungsreferenz (BT-83) sind in CII in ram:SpecifiedTradeSettlementPaymentMeans verschachtelt; in UBL flacher in cac:PaymentMeans. Beide Stylesheets lösen das korrekt auf – bei Eigenentwicklungen ist dieser Pfad aber ein häufiger Fehlerort.
GoBD und das Sichtdokument
Der Begriff „Sichtdokument" ist in keiner gesetzlichen Norm legal definiert – er bezeichnet in der Praxis das menschenlesbare Pendant zur strukturierten XML: die gerenderete Ansicht, die ein Mensch lesen, prüfen und freigeben kann.
Was das BMF-Schreiben vom 14. Juli 2025 festlegt
Das BMF-Schreiben vom 14. Juli 2025 (PDF) präzisiert die Archivierungspflichten für E-Rechnungen:
- Aufzubewahren ist der strukturierte Teil – also die XML-Datei so, wie sie empfangen wurde.
- Das menschenlesbare Sichtdokument (HTML-Ansicht, PDF-Ausdruck) muss nicht separat archiviert werden, solange die Original-XML vollständig vorliegt und keine zusätzlichen steuerlich relevanten Informationen enthält.
- Bei hybriden Formaten (ZUGFeRD/Factur-X) ist ebenfalls der strukturierte XML-Datenteil das primäre Aufbewahrungsobjekt – das eingebettete PDF muss nur zusätzlich aufbewahrt werden, wenn es steuerlich relevante Abweichungen enthält.
Für die Praxis bedeutet das: Die Browser-Ansicht im Viewer ist zum Lesen, Prüfen und Freigeben gedacht. Sie ist kein GoBD-konformes Archivdokument. Die Original-XML muss unveränderlich, maschinell auswertbar und für 10 Jahre (§ 147 Abs. 1 Nr. 1 i.V.m. Abs. 3 AO) archiviert bleiben.
Quellen: Bundesfinanzministerium – GoBD-Änderung 2025 (PDF) · IHK Darmstadt – Archivierung von E-Rechnungen
Im Zweifel Rücksprache mit dem Steuerberater – die vorstehenden Angaben geben den Stand des BMF-Schreibens vom 14. Juli 2025 wieder und ersetzen keine steuerliche Einzelberatung.
Einbindung in Portal- und Workflow-Systeme
Wer den KoSIT-XSLT-Stack nicht im Browser, sondern serverseitig in einen Rechnungseingangs-Workflow integriert, hat drei typische Muster:
1. DMS/ECM mit XSLT-Plugin Viele Dokumentenmanagementsysteme (z. B. ELO, d.velop, DocuWare) unterstützen XSLT-Transformationen als eingebetteten Verarbeitungsschritt. Das KoSIT-Stylesheet lässt sich dort direkt als Renderer-Konfiguration einbinden. Ergebnis: Die Rechnungsansicht liegt als PDF-Rendition neben der Original-XML im Dokumentenarchiv.
2. Peppol-AP / OZG-RE / ZRE-Portale Rechnungen, die über Peppol oder die deutschen B2G-Portale eingehen, sind bei Ankunft bereits gegen das offizielle KoSIT-Schematron validiert. Der Visualisierungs-Schritt kann direkt auf das gelieferte XML angewendet werden, ohne vorherige Syntaxprüfung.
3. Eigenentwicklung mit Saxon-HE (Java)
Für Java-Backends ist der direkte Aufruf über JAXP möglich – Saxon-HE ist kostenlos und unterstützt XSLT 3.0 vollständig. Für .NET-Stacks gibt es Saxon-HE ebenfalls. Die .xsl-Dateien aus dem KoSIT-Repository werden direkt verwendet; keine Kompilierung nach .sef.json nötig.
Validierung vor der Visualisierung: Die KoSIT stellt parallel zum Visualisierungs-XSLT auch Schematron-basierte Validierungsartefakte bereit (validator-configuration-xrechnung). Für produktive Systeme empfiehlt sich eine Validierung vor dem Rendering, damit fehlerhafte Rechnungen frühzeitig zurückgewiesen werden und nicht als visuell „korrekt" erscheinende, aber inhaltlich ungültige Sichtdokumente in den Freigabe-Workflow gelangen.
Was XRechnung 4.0 für bestehende Viewer-Stacks bedeutet
KoSIT hat im März 2026 XRechnung 4.0 als nächste Hauptversion angekündigt – Basis ist die neue europäische Norm EN 16931-1:2026, deren Veröffentlichung für Mitte 2026 erwartet wird. Der XRechnung-4.0-Release ist für H2 2026 vorgesehen.
Die wesentlichen strukturellen Änderungen, die Viewer-Stacks betreffen:
Aufgelöste 1:1:1-Beziehung: XRechnung 3.x bildet streng eine Bestellung – eine Lieferung – eine Rechnung ab. XRechnung 4.0 erlaubt eine Rechnung über mehrere Bestellungen und Lieferungen. Positionen müssen dadurch neu strukturiert werden; Visualisierungen, die auf die heutige flache Struktur optimiert sind, rendern Mehrfach-Referenzen möglicherweise unvollständig oder falsch.
XML-Attachments im Kernmodell: XRechnung 4.0 unterstützt strukturierte XML-Anhänge direkt im Rechnungsdokument. Viewer müssen entscheiden, wie Anhänge dargestellt oder ignoriert werden.
Neue Erweiterungs-Architektur: Eine zentrale Extension Component Library erlaubt branchen- oder länderweite Erweiterungen. Branchenspezifische Zusatzfelder tauchen künftig in regulären XRechnung-Dokumenten auf; Viewer, die unbekannte Extension-Elemente nicht tolerant ignorieren, können Rendering-Fehler zeigen.
XSLT-Update-Pflicht: Die KoSIT wird für XRechnung 4.0 ein neues Visualisierungs-Release veröffentlichen – Zeitpunkt noch offen. Wer Saxon-JS 2.7 im Browser einsetzt, muss dann neue .sef.json-Dateien kompilieren und ausliefern. Das ist operativ überschaubar, muss aber geplant sein. XRechnung 3.0.x-Dokumente validieren unter 4.0-Schematron nicht automatisch – parallele Versions-Unterstützung ist für Übergangsphasen nötig. Hinweis zum XSLT-Prozessor: Saxon-JS 3 befindet sich seit Dezember 2024 in der Beta-Phase; für den Browser-Einsatz gilt es als noch nicht produktionsreif, und die KoSIT-Stylesheets sind derzeit gegen Saxon-JS 2.7 getestet. Für XRechnung 4.0 wird ein Versions-Abgleich nötig sein. (Quelle: Saxon-JS Release Notes)
Empfehlung für heutige Implementierungen: Syntax-Version beim Empfang aus dem Dokument auslesen, versioniert verarbeiten und das Update auf XRechnung-4.0-Stylesheets als geplante Migrationsaufgabe einplanen.
Quelle: xeinkauf.de – XRechnung 4.0 · invoice-portal.de – XRechnung 4.0 & Peppol
Weiterführende Ressourcen
- KoSIT xrechnung-visualization (GitHub, Apache 2.0)
- xeinkauf.de – XRechnung Spezifikation & Releases
- xeinkauf.de – XRechnung 4.0 Umsetzung
- Bundesfinanzministerium – GoBD-Änderung 14.07.2025 (PDF)
- E-Rechnungspflicht 2025–2028
Vom Viewer zur Liquiditätsplanung
Ein Browser-Viewer löst das Sichtbarkeitsproblem für eine einzelne Rechnung. Wer Eingangsrechnungen strukturiert verarbeiten will, braucht mehr als eine Ansicht: Beträge und Fälligkeiten müssen ohne Abtippen in die Planung fließen.
Der Dienst hinter liqui.de liest XRechnung- und ZUGFeRD-XML automatisch ein, extrahiert Fälligkeitsdatum und Betrag und überführt sie direkt in die 13-Wochen-Liquiditätsvorschau. Die Original-XML bleibt dabei GoBD-konform erhalten – nicht als Hinweis im Tool, sondern als strukturelle Eigenschaft des Archivs.