- 1 Intro
- 2 Anwendungsgebiete
- 2.1 XSLT - die Programmiersprache im XML Bereich
- 2.2 Aktuelle und vergangene Anwendungen
- 2.3 Professionelle XML Verarbeitung
- 2.4 Technische Dokumentation
- 3 Wichtige Konzepte
- 3.1 Push vs. Pull Stylesheets
- 3.2 Eindeutigkeit der Regelbasis
- 3.3 Namespaces
- 3.4 Schemata
- 3.5 Standards
- 3.5.1 DITA
- 3.5.2 DITA Inhaltsmodell
- 3.5.1 DITA
- 4 Ausgewählte Themen
- 4.1 Transformationen mit XSLT
- 4.1.1 Vortransformationen
- 4.1.2 Komplexe XML-2-XML Transformationen
- 4.1.2.8 Vererbung
- 4.1.2.8 Vererbung
- 4.1.3 XSLT Streaming
- 4.1.3.1 XSLT Akkumulator
- 4.1.3.2 XSLT Iterator
- 4.1.4 Reguläre Ausdrücke
- 4.1.5 Modus vs. Tunnel Lösung
- 4.1.6 Identifikation mit
generate-id()
- 4.1.6.4 XPath-Achsenbereich selektieren
- 4.1.6.4.1 Funktionen und Module
- 4.1.6.4.1 Funktionen und Module
- 4.1.6.4 XPath-Achsenbereich selektieren
- 4.1.7 Webservice Calls mit doc() und unparsed-text()
- 4.1.8 Stylesheet-Parameter auf der Kommandozeile
- 4.1.9 Leerzeichenbehandlung
- 4.1.10 Mit
translate
Zeichen ersetzen
- 4.1.10.1 Spass mit dem Sequenzvergleich
- 4.1.11 Character Mappings in der Ausgabe
- 4.1.12 JSON mit XSLT 1.0 und Python lxml
- 4.1.1 Vortransformationen
- 4.2 Abfragen mit XQuery
- 4.2.5 XQuery als Programmiersprache
- 4.2.5.3
if..then..else
Ausdrücke
- 4.2.5.3.2 SQL Views in MarkLogic
- 4.2.5.3
if..then..else
Ausdrücke
- 4.2.6 Hilfreiche XQuery Schippsel
- 4.2.5 XQuery als Programmiersprache
- 4.3 XML Datenbanken
- 4.3.1 Connector zu Marklogic in Oxygen
- 4.3.2 Bi-Temporale Dokumente
- 4.3.2.1 Anlegen des Testszenarios auf der ML Konsole
- 4.3.2.2 Ausführen einiger Beispiel-Queries
- 4.3.3 Webapps mit MarkLogic
- 4.3.3.5 Wikipedia Scrapper Applikation
- 4.3.3.5 Wikipedia Scrapper Applikation
- 4.3.4 Dokument-Rechte in MarkLogic
- 4.3.5 MarkLogic Tools
- 4.3.5.1 EXPath Konsole
- 4.3.5.2 mlcp - MarkLogic Content Pump
- 4.3.5.3 Deployment-Tools
- 4.4 XSL-FO mit XSLT1.x
- 4.5 Testing
- 4.5.1 Validierung mit Schematron
- 4.5.2 Erste Schritte mit XSpec
- 4.5.1 Validierung mit Schematron
- 4.6 Performanz-Optimierung
- 4.1 Transformationen mit XSLT
- 5 Zusätzliches Know-How
- 5.1 XML Editoren
- 5.2 Quellcode-Versionskontrolle
- 5.2.1 Kurze Geschichte zur Versionskontrolle Test
- 5.2.2 GIT Kommandos
- 5.2.1 Kurze Geschichte zur Versionskontrolle Test
- 5.1 XML Editoren
- 6 Glossary
- 7 Tektur CCMS
2.2 Aktuelle und vergangene Anwendungen
Wie auch bei anderen Programmiersprachen, hat es einige Zeit gedauert bis sich für XSLT der optimale Anwendungsbereich herauskristallisiert hat. Auch bei XSLT war ursprünglich das Internet und insbesondere Webseitenprogrammierung die treibende Kraft, da mittels XSLT besonders gut Inhalt und Semantik getrennt werden konnte.
Relativ schnell hat sich aber CSS in Verbindung mit JavaScript als Standardlösung für diesen Zeck bewährt. XSLT ist inzwischen Platzhirsch im Bereich Technische Dokumentation, und hier auch wohl unschlagbar.
2.2.1 XML Webseiten
Einen XSLT Prozessor hat jeder Browser eingebaut. Es war mal sehr populär, Webseiten als XML auszuliefern und mittels XSLT zu layouten. U.a. wegen des exzessiven Einsatzes von JavaScript (auch inline), hat sich diese Idee nie vollständig durchgesetzt. Schliesslich wurde XHTML spezifiziert und jetzt gibt es HTML5.
Betrachten wir das folgende XML Beispiel:
<?xml version="1.0" encoding="UTF-8"?> <document> <title>Das ultimative Zwei-Kapitel Dokument</title> <chapter> <title>Kapitel 1</title> <intro>In Kapitel 1 wird kurz gesagt was Sache ist.</intro> <content>Um es kurz zu machen, wie der Hase läuft steht in Kapitel 2.</content> </chapter> <chapter> <title>Kapitel 2</title> <intro>Hier wird erklärt, wie der Hase läuft.</intro> <content>Im Prinzip ist es ganz einfach.</content> </chapter> </document>
Ohne XSLT Stylesheet Zuweisung wird der Browser eine Datei mit diesem Inhalt als eingerücktes XML anzeigen - oder die Tags einfach ignorieren und den Textinhalt in einer Zeile darstellen. Fügt man eine Processing Instruction ↗
am Anfang ein, wird ein XSLT Stylesheet vom Browser herangezogen, und vor der Darstellung im Browser wird die so deklarierte XML Transformation ausgeführt:
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="formatiermich.xsl" ?> <document> <title>Das ultimative Zwei-Kapitel Dokument</title> <chapter> [...]
Das XML kann nun im Browser geöffnet werden. Alles wird schön formatiert angezeigt...
<?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <xsl:apply-templates/> </html> </xsl:template> <xsl:template match="document"> <body> <xsl:apply-templates/> </body> </xsl:template> <xsl:template match="document/title"> <h1> <xsl:apply-templates/> </h1> </xsl:template> <xsl:template match="chapter"> <div class="chapter"> <xsl:apply-templates/> </div> </xsl:template> <xsl:template match="chapter/title"> <h2> <xsl:apply-templates/> </h2> </xsl:template> <xsl:template match="chapter/intro"> <div class="intro"> <i><xsl:apply-templates/></i> </div> </xsl:template> <xsl:template match="chapter/content"> <p><xsl:apply-templates/></p> </xsl:template> </xsl:stylesheet>
Die Processing Instruction hat keinen Einfluss auf den XML Inhalt und wird in einer anderen Eingabeverarbeitung nicht herangezogen.
2.2.2 Serverseitige Konvertierung
Auch eine serverseitige Konvertierung ist gebräuchlich. Ein Beispiel aus vergangenen Tagen - WAP-Seiten ↗ für unterschiedliche Handy-Modelle.
Früher hatten die Handys sehr unterschiedliche Displaygrößen. Handybrowser konnten nicht ausreichend JavaScript und die Skalierung der WAP-Seite für das jeweilige Handy passierte nicht im Handy, sondern vor der Auslieferung auf der Serverseite. Dazu wurde eine XML Quelle mittels verschiedener XSLT Stylesheets in unterschiedliche WML WAP Repräsentationen transformiert.
So würde das Zwei-Kapitel Beispiel von oben im WML Format aussehen (recht einfach gehalten):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wap.org/DTD/wml_1.1.xml"> <wml> <head> <meta name="title" content="Das ultimative Zwei-Kapitel Dokument"/> </head> <card id="chapter1" title="Kapitel 1"> <p><i>In Kapitel 1 wird kurz gesagt was Sache ist.</i></p> <p>Um es kurz zu machen, wie der Hase läuft steht in Kapitel 2.</p> </card> <card id="chapter2" title="Kapitel 2"> <p><i>Hier wird erklärt, wie der Hase läuft.</i></p> <p>Im Prinzip ist es ganz einfach.</p> </card> </wml>
Eine XSLT Transformation, die die XML Daten von oben in diese WML Darstellung überführt, könnte z.B. so implementiert werden:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output doctype-public="-//WAPFORUM//DTD WML 1.2//EN" doctype-system="http://www.wapforum.org/DTD/wml12.dtd" indent="yes"/> <xsl:template match="document"> <wml> <xsl:apply-templates/> </wml> </xsl:template> <xsl:template match="document/title"> <head> <meta name="title"> <xsl:attribute name="content"> <xsl:value-of select="."/> </xsl:attribute> </meta> </head> </xsl:template> <xsl:template match="chapter"> <card id="{concat('chapter',count(preceding-sibling::chapter)+1)}"> <xsl:attribute name="title"> <xsl:value-of select="title"/> </xsl:attribute> <xsl:apply-templates select="*[not(self::title)]"/> </card> </xsl:template> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="processing-instruction()"/> <xsl:template match="intro"> <p><i><xsl:apply-templates/></i></p> </xsl:template> <xsl:template match="content"> <p><xsl:apply-templates/></p> </xsl:template> </xsl:stylesheet>
2.2.3 Multiple Ausgabeformate
Aus einer XML Quelle können auch leicht weitere Format erzeugt werden, bspw. EPUB ↗ Das ist das Standardformat für eBooks. Neben Tags zur Formatierung für den Content, gibt es bspw. auch Anweisungen zum Erzeugen des Inhaltsverzeichnisses oder anderer Navigationsstrukturen.
Weitere gängige Formate sind neben dem oben veralteten WML Format, elektronische Ausgabe-Formate wie: CHM ↗, EclipseHelp ↗, JavaHelp ↗, ..., Print-Ausgabe Formate, wie PDF oder Adobe Framemaker ↗, oder XML Standard Austauschformate, wie DITA, S1000D, PI-MOD ↗, JATS ↗
oder TEI ↗
.
2.2.4 Menschenlesbare Ausgabe
Kryptische XML Log-, Daten- oder Konfigurationsfiles können leicht mit XSLT "menschenlesbar" formatiert werden. Ein Arbeitskollege im neuen Job kam kürzlich auf mich zu, ob ich um eine Möglichkeit wüsste, wie man sein kryptisches Datenfile für einen Übersetzungsdienst formatieren könnte:
<?xml version="1.0" encoding="UTF-8"?>?<?xml-stylesheet type="text/xsl" href="de.xsl"?> <jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:mix="http://www.jcp.org/jcr/mix/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0" jcr:language="de" jcr:mixinTypes="[mix:language]" jcr:primaryType="sling:Folder"> <b_manual jcr:primaryType="sling:MessageEntry" sling:message="Bedienungsanleitung"/> <b_warning jcr:primaryType="sling:MessageEntry" sling:message="Warnung"/> <b_danger jcr:primaryType="sling:MessageEntry" sling:message="Vorsicht"/> <b_note jcr:primaryType="sling:MessageEntry" sling:message="Notiz"/> <b_notice jcr:primaryType="sling:MessageEntry" sling:message="Hinweis"/> [...]
Mit einem eingehängten XSLT Stylesheet
de.xsl
wird so ein Datenfile als Tabelle formatiert:
<?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:sling="http://sling.apache.org/jcr/sling/1.0"> <xsl:template match="jcr:root"> <html> <table border="1" cellpadding="5" cellspacing="5"> <xsl:apply-templates/> </table> </html> </xsl:template> <xsl:template match="*"> <tr> <td> <xsl:value-of select="concat(count(preceding::*[@sling:message]) + 1,'.')"/> </td> <td> <xsl:value-of select="name()"/> </td> <td contenteditable="true"> <xsl:value-of select="@sling:message"/> </td> </tr> </xsl:template> </xsl:stylesheet>
Hängt man an dieses Beispiel noch ein bisschen JavaScript Logik und macht die Felder für die Übersetzungen mittels des HTML5
contenteditable
Attributs editierbar, dann bräuchte man nur noch eine Rücktransformation HTML nach XML und hätte schon einen kleinen XML Editor gebaut. So funktioniert auch der Editor in Tektur.
2.2.5 Diagramme darstellen
Nachdem eine SVG
Grafik im XML Format vorliegt, kann diese auch direkt mittels XSLT erzeugt werden. Über das HTML5
<svg>
Element kann so eine Grafik inline in das - ebenfalls durch das XSLT - generierte HTML Dokument eingebunden werden.
Betrachten wir unser Beispiel von oben, erweitert um drei neue
<block>
Elemente:
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="chart.xsl" ?> <document> <title>Das ultimative Zwei-Kapitel Dokument</title> <chapter> <title>Kapitel 1</title> <intro>In Kapitel 1 wird kurz gesagt was Sache ist.</intro> <content>Um es kurz zu machen, wie der Hase läuft steht in Kapitel 2.</content> </chapter> <chapter> <title>Kapitel 2</title> <intro>Hier wird erklärt, wie der Hase läuft.</intro> <content>Im Prinzip ist es ganz einfach. Betrachten wir doch drei gelbe Blöcke: </content> <block/> <block/> <block/> </chapter> </document>
Wenn wir das XSLT Stylesheet noch um eine Regel für das neue
<block>
Element ergänzen, so wie hier:
<xsl:template match="block"> <svg style="background-color:yellow" width="30" height="30" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"/> <br/> <br/> </xsl:template>
Dann erhalten wir drei schön formatierte gelbe SVG Blöcke ...
Weiterführende Links: