Transformation von XML-Dokumenten — XSLT und XPath — Anne Brüggemann-Klein TU München Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 1 XSLT … o o o XML (und XML Namespaces und Unicode) zur Kodierung von Dokumentendaten XSLT zur Bearbeitung von Dokumentendaten o o o o o Paradigma: Transformation (Querysprache) Wurzel: Stylesheets Zielsprachen: HTML, XML (z.B. XSL-FO), Text Grundlage: Ausdruckssprache XPath o Adressierung von Teilen des XML-Dokuments o Konstruktion von XML-Fragmenten durch Berechnung und Transformation Grundlage: Datenmodell Erfahrung: XSLT macht XML operationabel Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 2 … XSLT o XSLT-Sprache o o o deklarativ, berechenbarkeitsuniversell mit XQuery das SQL für XML: XQuery als Abfragesprache, XSLT für Komposition von Ergebnissen XML-Syntax o Interpreter o aufgerufen von XSLT-Prozessor für XML-Dokument und XSLTProgramm (transparent) transparente Benutzung von APIs (normalerweise SAX und DOM/eigenes Dokumentenmodell) o XSLT-Prozessor o Rolle von XML-Parsern o Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 3 XML XSLT XML Transformation zwischen Formaten bzw. Baumstrukturen, basierend auf Information Set <...> <...> <...>...</...> <...>...</...> </...> <...> <...>...</...> <...>...</...> </...> Text, XML XML, HTML, Text <XSLT/> <...> <...> <...>...</...> <...>...</...> </...> <...> <...>...</...> <...>...</...> </...> </...> <...> <...> <...>...</...> <...>...</...> </...> <...> <...>...</...> <...>...</...> </...> <XML/> <XML/> </...> </...> XSLT-Prozessor Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 4 W3C-Standardisierung XSLT: XSL Transformation, W3C-Standard seit 16.11.1999 XPath: XML Path Language, W3C-Standard seit 16.11.1999 Candidate Recommendations seit 8.6./11.7.2006 o XSLT 2.0 o XPath 2.0 o Gemeinsames Datenmodell für XPath/XQuery Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 5 Datenmodell … o o o XQuery 1.0 and XPath 2.0 Data Model (XDM) W3C Candidate Recommendation 11 Juli 2006 (http://www.w3.org/TR/xpath-datamodel/) XML Information Set (Second Edition) W3C Recommendation 4 February 2004 (http://www.w3.org/TR/xml-infoset/) Gemeinsames Datenmodell von XPath, XSLT, XQuery o o o abgeleitet aus XML Information Set des W3C (einheitliche Terminologie für XML-Konstrukte) gemeinsame Abstraktionsschicht oberhalb der Zeichenkettensicht auf XML konzeptionelles Ergebnis des Parsens, auf das die genannten Prozessoren zugreifen können Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 6 … Datenmodell … o Steckbrief o o o o XDM als Baummodell mit Knoten (Element- und Attributknoten bereits besprochen) Sieben Knotentypen mit Attributen zur Beschreibung der Knoten selbst und der Relationen zwischen den Knoten Keine Berücksichtigung von Entitäten-Referenzen Aufbau des Datenmodells nach Expansion von Referenzen Warnung: Unsymmetrische Eltern-Kind-Beziehung o o Kindbeziehung nur zwischen Elementknoten und untergeordneten Element-, Text-, PI- und Kommentarknoten Elternbeziehung auch zwischen Attribut- und Namespaceknoten zu zugehörigem Elementknoten Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 7 Root Node (Document Inf Item) Element Node (Element Inf Item) Attribute Node (Attribute Inf Item) [children] [expanded name] [expanded name] [children] [value] [attributes] [parent] Processing Instruct Node (Proc Instruct Inf Item) [expanded name] [namespaces] [parent] [content] [parent] Comment Node (Comment Information Item) [content] [parent] Namespace Node (Namespace Decl Inf Item) Text Node (Character Inf Items) [prefix] [content] [parent] [parent] [namespace name] … Datenmodell o Document Order o o o o Reihenfolge der Knoten bestimmt durch erstes Zeichen des Knotens im XML-Dokument (gilt für Element Nodes, Text Nodes, Comment Nodes, Processing Instruction Nodes) Root Node an erster Position Nach Element Node erst alle zum Element gehörigen Namespace Nodes, dann alle Attribute Nodes, jeweils in unbestimmter Reihenfolge, dann erst die Inhaltsknoten (geordnet) Visualisierung mit grau hinterlegten Namespace-Knoten (../../xmlSamples/compBookNSModel.vsd) Weiteres Beispiel im XDM-Standard (http://www.w3.org/TR/2005/CR-xpath-datamodel-20051103/dm-example-large.png) Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 9 XSLT-Programmierung nach dem Pull-Prinzip o Programmierprinzip Pull (fill in the blanks, output driven) o o o o Transformationsprogramm als Ergebnis-Skelett Lokalisieren von zu importierenden Bestandteilen des Eingabedokuments in die „Leerstellen“ des Ergebnis-Skeletts über XPath-Ausdrücke Schleifen für Import-Wiederholungen (Iterationen definiert durch XPath-Ausdrücke über Eingabedokument) Beispiel ../../xsltBeispiele/king.xml ../../xsltBeispiele/acknowledgePullSimple.xsl ../../xsltBeispiele/ack.king.xml ../../xsltBeispiele/doAcknowledgePullSimple.bat Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 10 XSLT-Befehle für Pull-Programmierung … o Wörtliche Daten o XSLT-Kommandos (XSLT-Namespace) für eingabeabhängige und berechnete Daten o o Text (alternativ mit XSLT-Kommando xsl:text) literal result elements, auch mit Attributen o Import von Text aus Eingabedokument: o Import von Teilstrukturen: o xsl:value-of mit Attribut select (XPath-Ausdruck) xsl:copy-of mit Attribut select (XPath-Ausdruck) Konstruktion von Elementen und Attributen xsl:element mit Attribut name (XPath-Template) xsl:attribute mit Attribut name (XPath-Template) Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 11 … XSLT-Befehle für Pull-Programmierung o XSLT-Kommandos (XSLT-Namespace) zur Ablaufsteuerung o Bedingte Anweisung: o Alternative: o xsl:if mit Attribut test (XPath-Ausdruck) xsl:choose mit Kindelementen xsl:when und xsl:otherwise Schleife: xsl:for-each mit Attribut select (XPath-Ausdruck) Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 12 XSLT-Prozessor Xalan o o o o o o o o Xalan (Apache) http://xml.apache.org/xalan/overview.html XSLT-Prozessor in C++ und Java (Open Source) Parser Xerces (Apache) Commandline-Interface java org.apache.xalan.xslt.Process -in xmlQuelle -xsl xsltRegeln -out output Aufruf aus Java-Anwendung: TrAX API als Teilmenge von JAXP 1.1 Applet-Wrapper, Servlet Wrapper XPath-Implementierung Xalan-Erweiterungen: Funktionen und Elemente Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 13 XSLT Ressourcen o o o o o o o http://www.w3.org/Style/XSL/ http://www.xslinfo.com/ (James Tauber) http://www.oasis-open.org/cover/xsl.html (Robin Cover) http://www.xml.com/ (O'Reilly) http://msdn.microsoft.com/xml/ http://www.mulberrytech.com/xsl/xsl-list Michael Kay: XSLT 2nd Edition. Wrox 2001. Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 14 XPath: Steckbrief o o o o XML Path Language (XPath), Version 1.0 W3C Recommendation, 16. November 1999 (wie XSLT) XPath-Ausdrücke, um Teile von XML-Dokumenten zu adressieren (Navigation durch die hierarchische Struktur) Auch Berechnungen allgemeiner Art Verwendet in XSLT o Formulierung von Mustern o Adressierung von zu transformierenden Bestandteilen o Berechnung von zu generierenden Teilen der Ausgabe Verwendet in XLink, XForms und XQuery Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 15 Ausdruckstyp Location Path Lokalisierung von XML-Konstrukten durch Navigation (z.B. mit <xsl:value-of select=""/>) ausgehend von Kontextknoten o Step mit drei Teilen o o o Achse (Richtung für den Schritt) Knotentest (für Typ und Expanded Name) Prädikate mit beliebigen Ausdrücken o AxisSpec: Achse für die zu berechnenden Knoten; o o o z.B. Kinder, Vergänger etc. NodeTest: Namen und Typ der zu berechnenden Knoten Prädikat: Filter für Initialmenge von Knoten (iterativ) Pfadausdruck: Folge von Steps Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 16 Beispiele für Location Path-Ausdrücke child::para child::* child::text() child::node() attribute::version descendant::para ancestor::div ancestor-or-self::div descendant-or-self::para self::para child::chapter/descendent::para child::*/child::para / /descendant::para /descendant::olist/child::item child::para[position()=1] child::para[position()=last()-1] child::*[self::chapter or self::appendix][position()=last()] child::para[attribute::type=´warning´][position()=5] child::para[position()=5][attribute::type=´warning´] child::chapter[child::title=´Introduction´] child::chapter[child::title] Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 17 Abkürzungen in Location Path-Ausdrücken o o AbbrAbsoluteLocPath := ´//´ RelativeLocPath AbbrRelativeLocPath := RelativeLocPath ´//´ Step AbbrStep ;= ´.´ | ´..´ AbbrAxisSpec := ´@´? <nichts> child:: @ attribute:: // /descendant-or-self::node()/ . self::node() .. parent::node() Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 22 Beispiele für abgekürzte Location Path-Ausdrücke para para[@id] para/@id /*/para .//para */para //para para[1] para[last()-1] ../@type para[@type=´warning´][5] para[5][@type=´warning´] * / text() node() @version chapter//para //olist/item *[self::chapter or self::appendix][last()] chapter[title=´Introduction´] chapter[title] Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 23 Erweiterung von Location Path-Ausdrücken Beliebiger Ausdruck vom Typ Knotenmenge o optional gefolgt von Filterprädikaten o optional gefolgt von Location Path Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 24 Bewertung o o o o o XPath als Sprache von Ausdrücken, mit denen Fragmente von XML-Dokumenten lokalisiert werden können Schrittweises Navigieren durch Dokumentenbaum, von Kontextknoten ausgehend, in jedem Schritt lokale Filterung, führt zu Knotenmenge als Ergebnis Lokalisierung durch Navigation im Dokumentenbaum o eingängig, auch durch Analogie bei Directories Komplexe Syntax, optimiert auf kurze Ausdrücke Grundsätzliche Fragen (z.B. der Optimierung und simultanen Auswertung) weitgehend offen Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 25 Aufgaben (Abgabe 18.11.2006) o Installieren Sie Xalan. o Schreiben Sie ein XSLT-Programm nach dem Pull- Prinzip, mit dem Sie die Wirkung von XPath-Ausdrücken gegenüber einem XML-Dokument testen können. Außer dem XSLT-Kommando xsl:value-of können Sie auch die Befehle xsl:copy-of und xsl:copy zum Kopieren von XML-Strukturen von der Quelle in das Zieldokument benutzen. o o Testen Sie Ihr Programm und einige Ausdrücke. Alternative: http://www.futurelab.ch/xmlkurs/xpath.de.html o Schreiben Sie ein XSLT-Programm, das Ihr Gedicht/Ihren Song nach HTML konvertiert. Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 26 Allgemeine XPath-Ausdrücke o Ausdrücke evaluieren zu einem von vier Typen o node-set o boolean o number o string in einem Kontext aus fünf Bestandteilen o Kontextknoten ändern sich bei o Kontextposition und Kontextgröße Teilausdrücken o Menge von Variablenbindungen o Funktionsbibliothek o Menge von Namespace-Deklarationen Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 27 Allgemeine Ausdrücke … o o Ausdrücke aus Typ PathExpr mit Operatoren: o or o and o = != o < > <= >= o+ o * div mod o - (einstellig) o| mehrstellige Operatoren linksassoziativ, steigende Präzedenz Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 28 … Allgemeine Ausdrücke … op: = != <= < >= > NodeSet A NodeSet A´ Boolean b A op A´ gdw ex n in A, n´ in A´: stringValue(n) op stringValue(n´) A op z gdw ex n in A: number(stringValue(n)) op z A op s gdw ex n in A: stringValue(n) op s A op b gdw boolean(A) op b op: = != op: <= < >= > Boolean Number String Konvertiere Operanden nach Number Number z String s Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 29 … Allgemeine Ausdrücke o XPath-Ausdruck o PrimaryExp ::= FilterExp PathExp ::= ::= o o Location Path sonstiger Ausdruck, im Falle von Typ Knotenmenge o optional gefolgt von Filterprädikaten o optional gefolgt von Location Path VariableReference | ´(´ Exp ´)´ | Literal | Number | FunctionCall PrimaryExp Pred* LocPath | FilterExp | FilterExp ´/´ RelativeLocPath | FilterExp ´//´ RelativeLocPath Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 30 XPath-Beispiele para[last()-1] *[self::chapter or self::appendix][last()] para[@type=´warning´][5] para[5][@type=´warning´] chapter[title=´Introduction´] chapter[title] para para[@id] para/@id /*/para document(´lookup.xml´) $paragraphs $paragraphs[23] $sections/body $sections[3]/body (//section | //subsection) [title=´Introduction´] (//section | //subsection) //para (//section | //subsection) //para)[last()] Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 34 Profil XSLT XSLT als deklarative Sprache für Transformationen Typische Transformationen o o o o o o o Umbenennungen von Textstrukturen Verschieben und Duplizieren von Textstrukturen Generieren und Unterdrücken von Textstrukturen Aggregation und Gruppierung von Textstrukturen Arithmetische Umrechnungen Sortieren Auswahl von Textstrukturen (XPath) Insbesondere: Transformation in XML-Dialekte (z.B. Formatanpassungen) und Präsentationsformate (HTML, XSL-FO/PDF, WML, …) Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 35 XML XSLT XML am Beispiel o o Aus der Organisation einer Konferenz Beispiel für Daten als Dokumente Einfache Form der XSLT-Programmierung (Fill in the Blanks, Outputsteuerung, Pull-Prinzip) o o Transformationsprogramm als Ergebnis-Skelett „Freistellen“ im Ergebnis-Skelett importieren über XPathAusdrücke die gewünschen Inhalte, eventuell abhängig von Bedingungen oder eingebettet in Schleifen für Wiederholungen king.xml | acknowledgePull.xsl | ack.king.xml | doAcknowledgePull Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 36 XML XSLT XML am Beispiel o Mächtigere Form der XSLT-Programmierung, geeignet für Transformation narrativer Dokumente (Inputsteuerung, Push-Prinzip) o o o Transformationsprogramm als Sammlung von Templates (z.B. pro Element) mit Ergebnis-Skelett „Freistellen“ im Ergebnis-Skelett gefüllt durch rekursiven Aufruf weiterer Templates, eventuell abhängig von Bedingungen oder eingebettet in Schleifen für Wiederholungen Beim Aufruf eines Templates o Angabe welche Elemente bearbeitet werden o Suche nach passendem Template für jedes Element king.xml | acknowledgePush.xsl | ack.king.xml bios.xml | bios2html.xsl | bios.htm Konzept.xml | Konzept.xsl | Konzept.htm | doKonzept.bat Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 37 Prozeßmodell von XSLT … XSLT-Transformationsprogramm: Sammlung von Regeln (xsl:template) o Muster/Aufhänger (Attribut match von xsl:template) o Auf welche Elemente im Quelldokument paßt die Regel? Blaupause/Schablone/Ergebnisskelett (Inhalt von xsl:template) Was schreibt die Regel für das passende Element vor? Was wird im Zieldokument eingefügt? Baum bzw. Hecke (Sequenz von Bäumen): o wörtliche Daten: Text und literal result elements o zentrale XSLT-Kommandos (XSLT-Namespace) o xsl:apply-templates mit Attribut select o xsl:value-of mit Attribut select Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 38 … Prozeßmodell von XSLT Anwendung eines XSLT-Stylesheets auf ein XML-Dokument (bzw. seine Source-Tree-Repräsentation) erzeugt Result Tree (initialisiert mit dem Wurzelknoten) o o o o Kontextknoten im Source Tree (Start bei Root) Platzhalterknoten (Einfügezeiger) im Result Tree Auswahl einer Regel, die auf den Kontextknoten paßt: Konfliktauflösung Umsetzung der Blaupause zur gefundenen Regel (Instantiieren): Ausführen von XSLT-Kommandos und Kopieren von Daten (literal result elements und Text) zum Result Tree Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 39 Die Sprache XSLT … o o Oberstes Element: xsl:stylesheet, xsl:transform o Präfix xsl gebunden an URL o version='1.0' http://www.w3.org/1999/XSL/Transform Darunter die folgenden Top-Level-Elemente von XSLT o o o o o o xsl:import href='', xsl:include href='' xsl:strip-space elements='' xsl:output method='' encoding='' indent='' xsl:variable name='' select'' xsl:param name='' select'' xsl:template match='' priority='' mode='' name='' Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 40 … Die Sprache XSLT … o Patterns o o o o Ausdrücke im Attribut match von xsl:template Verallgemeinerung und Spezialisierung von XPath-Ausdrücken, die zu Knotenmengen evaluieren Ein Pattern trifft auf einen Knoten zu (Match), wenn der Knoten, von beliebigem Kontextknoten aus evaluiert, in der Ergebnismenge des Patterns liegt „Ausdrücke von rechts nach links statt von links nach rechts evaluieren“ Konfliktauflösung für Templates Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 41 … Die Sprache XSLT … o Default-Templates o o <xsl:template match='*|/'> <xsl:apply-templates/> </xsl:template> <xsl:template match='text()|@*'> <xsl:value-of select='.'/> </xsl:template> Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 42 … Die Sprache XSLT … Kommandos unterhalb von xsl:template o xsl:apply-templates select='' mode='' o xsl:with-param name='' select='' o xsl:value-of select='' disable-output-escaping= '' o xsl:text disable-output-escaping= '' o o o o erzeugt Textknoten Ausdruck in Attribut select wird evaluiert und zu String konvertiert Text als Inhalt des Elements xsl:number level='' count='' from='‚ format='' value='' Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 43 … Die Sprache XSLT … o o xsl:element name= '' namespace= '' o xsl:copy, xsl:copy-of o xsl:processing-instruction name= '' o xsl:comment xsl:attribute name= '' namespace= '' o o o o Attributwert als Inhalt des Elements flache bzw. tiefe Kopie von Knoten PI-Inhalt als Inhalt des Elements Kommentar als Inhalt des Elements Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 44 … Die Sprache XSLT o o xsl:call-template name='' xsl:with-param name='' select='' xsl:for-each select= '' o Ausdruck in Attribut select muß zu Knotenmenge evaluieren o xsl:if test='' o o xsl:param name='' select'‚ o Ausdruck in Attribut test muß zu Booleschem Wert evaluieren xsl:variable name='' select'' Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 45 Drei XSLT-Programmierstile o Pull-Schema (Fill in the blanks, navigierend) o o o Zielstruktur wird statisch zusammengesetzt, mit Bausteinen aus Quellstruktur Mittel: xsl:value-of und prozedurale Anweisungen typisch für datenorientierte Anwendungen o o o Transformation von Zielstruktur aus Quelle Mittel: xsl:apply-templates, Modi typisch für textorientierte Anwendungen o Benannte Templates mit Parametern o Push-Schema (regelbasiert) o Funktionale Programmierung (rekursiv) Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 46 Variablen und Parameter in XSLT o Variablentypen (read-only) o o o o Globale Variablen: auf oberster Ebene Gültigkeitsbereich: ganzes Transformationsprogramm Lokale Variablen: in Blaupause eines Templates Gültigkeitsbereich (statisch): auf Definition folgende Geschwister und deren Nachkommen (Blockstruktur) Instantiierung dynamisch mit Template Definition <xsl:variable name="vName" select="exp"/> <xsl:variable name="vName"> … </xsl:variable> Verwendung: $vName Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 47 Verwendung von Variablen o o o Abkürzung, Vermeidung von Mehrfachberechnungen Verbesserung der Lesbarkeit und Effizienz Referenz auf Kontextknoten, lesbar nach Kontextwechsel bios.xml | bios2html.xsl | bios.htm Speicher für temporären Teilbaum (über Wurzelknoten), (ab XSLT 1.1) mit XPath-Ausdrücken navigierbar <xsl:variable name="tempTree"> <xsl:call-template name="getTempTree"/> </xsl:variable> <xsl:variable name="tempDoc" select="document('')"/> Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 48 Parameter in XSLT o o Parameter genauso wie Variablen, zusätzlich Werte von außen setzbar (Aufruf von Programm oder Template) Parametertypen o Definition o Verwendung: $pName o o Globale Parameter: auf oberster Ebene, von außen initialisierbar Lokale Parameter: in Blaupause eines Templates, bei Aufruf initialisierbar <xsl:call-template name="tName"> <xsl:with-param name="pName"/> </xsl:call-template> <xsl:param name="pName" select="exp"/> <xsl:param name="pName"> … </xsl:param> Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 49 Funktionale Programmierung … o o o Programm: Funktionsaufruf mit Argumenten, die wieder Funktionsaufrufe enthalten o o beliebige Schachtelungstiefe auch Rekursion Modell: -rekursive Funktionen Programmiersprachen: Lisp, Haskell Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 50 … Funktionale Programmierung o o o o o Funktionsausführung ohne Seiteneffekte: keine Veränderung eines globalen Zustands, keine Setzung von Variablen mit globaler Gültigkeit Ergebnis einer Funktionsausführung nur abhängig von Argumenten, nicht von Vorgeschichte Rekursion statt Iteration In XSLT: Ausführung eines Templates nur abhängig von Kontext, nicht von Vorgeschichte Variablen nach Initialisierung read-only dadurch inkrementelle Ausführung einer XSLTTransformation nach Änderungen im Dokument möglich In XSLT: Rekursive Template-Aufrufe mit Argumenten Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 51 Rekursion statt Iteration <xsl:template name="while"> <xsl:param name="state"/> <xsl:if test="condition on $state"> <xsl:variable name="newState" select="compute new $state"/> <xsl:call-template name="while"> <xsl:with-param name="state" select="$newState"/> </xsl:call-template> </xsl:if> </xsl:template> Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 52 Fazit XSLT ist berechenbarkeitsuniversell Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 53 Bedingte Wertzuweisung <xsl:variable name="x"> <xsl:choose> <xsl:when test="$zeroBased">0</xsl:when> <xsl:otherwise>1</xsl:otherwise> </xsl:choose> </xsl;variable> <xsl:variable name="transactions" select= "//credits[$getCredits] | //debits[not($getCredits)]"/> Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 54 Sortieren … o o o o Bestimmen der Reihenfolge der zu bearbeitenden Knoten mit xsl:sort Verwendbar mit xsl:apply-templates und xsl:for-each Attribute Ausdruck ascending, descending case-order upper-first, lower-first lang Sprachkode data-type text, number, Name select order Sortierkriterium Sortierreihenfolge Sortiermethode Sortiermethode Sortiermethode Mehrere xsl:sort kombinierbar, keine Doppeleliminierung Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 55 … Sortieren <xsl:apply-templates select="book" <xsl:sort select="@isbn"/> </> <ul> <xsl:for-each select="//city[not(.=preceding::city)]"/> <xsl:sort select="."/> <li><xsl:value-of select="."/></li> </> </ul> Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 56 Identifizieren und Vergleichen o o Berechnung einer eindeutigen Knoten-ID mit Funktion generate-id() (pro XSLT-Bearbeitung!) Anwendung Monats-Kontainer: Vergleich von Knoten <plan><month>April</month><task>…</task><task>…</task> <month>May</month><task>…</task><task>…</task></plan> <xsl:for-each select="month"> <tasks month="{.}"> <xsl:variable name="mID" value="generate-id()"/> <xsl:copy-of select=" following-sibling::task[ $mID=generate-id(preceding-sibling::month[1]) ]"/> </tasks> </> Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 57 Lokalisieren von Knoten nach Werten … o o o Aufbau eines Indexes mit xsl:key Verwendbar auf oberster Ebene eines XSLT-Programms Attribute o Nutzung des Indexes mit Funktion key(Indexname,Indexterme) name match use Name Ausdruck Ausdruck Name des Indexes zu indexierende Knoten Indexterm Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 58 … Lokalisieren von Knoten nach Werten … <xsl:key name="bookAuthor" match="book" use="author/name"/> <xsl:for-each select="key(′bookAuthor′,′A. Christie′)"/> <xsl:variable name="ac" select="key(′bookAuthor′,′A. Christie′)"/> <xsl:for-each select="key(′bookAuthor′,$ac/author/name)"/> Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 59 … Lokalisieren von Knoten nach Werten <cities> <city name="Paris" country="France"/> <city name="Roma" country="Italia"/> <city name="Nice" country="France"/> </cities> <xsl:key name="cityByCntry" match="city" use="@country"/> <xsl:for-each select="//city[generate-id()= generate-id(key(′cityByCntry′,@country)[1])]"> <h1><xsl:value-of select="@country"/></h1> <ol><xsl:for-each select="key(′cityByCntry′,@country)"> <li><xsl:value-of select="@name"/></li></> </ol> </> Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 60 XML XSLT HTML am Beispiel o o o o o o o o Komplexere Form der XSLT-Programmierung mit Vielzahl von Regeln, Rekursion, XPath-Ausdrücken Spielzeugbuch über Compilerbau: compBook.xml DTD für Spielzeugbücher: book.dtd XSLT-Transformationsregeln: book2html.xsl Ergebnis der Transformation: compBook.htm CSS-Stylesheet für HTML: book.css Parseraufruf: parseCompBook.bat Transformationsaufruf: doBook2html.bat Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 61 Spezialfall Formatierung o o o strukturierte Dokumente Formatvorgabe Formatierung als XML XSLT Transformation XSLT-P in eine XML-kodierte Designstruktur und deren Designstruktur XSL-FO Interpretation FOP (preformat.bat, format.bat): formatiertes Dokument PDF XSL-FO: XML-Format für Designstrukturen Umgesetzt mit der Extensible Style Language XSL XSL = XML (XSLT XML)* XSLT XSL-FO Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 62 Literatur zu XSL und XSL-FO o o o o o W3C: Extensible Stylesheet Language (XSL). Okt 2001. [http://www.w3.org/TR/xsl/] E.R. Harold: The XML Bible. [http://www.ibiblio.org/xml/books/bible2/chapters/ch18.html] J.D. Eisenberg: Using XSL Formatting Objects. [http://www.xml.com/pub/a/2001/01/17/xsl-fo/index.html] RenderX: XSL Formatting Objects Tutorial. [http;//www.renderx.net/Content/support/xep/tutorial.html] Antenna House: How to Develop Stylesheet for XML to XSL-FO Transformation. [http://www.antennahouse.com/XSLsample/howtoRC/Howtodevelop-en-2.pdf] Elektronisches Publizieren: Transformation von XML-Dokumenten 13./15.November 2006 ― 63