XSLT Tobias Kieninger Christian Dedek Thomas Bayer [email protected] Orientation in Objects GmbH Weinheimer Str. 68 68309 Mannheim www.oio.de 1 Ihre Speaker Tobias Kieninger Christian Dedek 2 XSLT © 2002 Orientation in Objects GmbH 1 Organisatorisches • Unterlagen • Kein Rechner benötigt • http://www.oio.de/public 3 XSLT © 2002 Orientation in Objects GmbH Überblick • • • • • • • • XSLT Einführung Stylesheets XPath Advanced XSLT Anwendungen PDF Erzeugung Erzeugung von Grafiken XSLT Praxis Techniken und Beispiele 4 XSLT © 2002 Orientation in Objects GmbH 2 "Als Antwort der Industrie auf den Welthunger hat XML Java, Entwurfsmuster und die Objekttechnologie ersetzt... Trotzdem ist die Industrie im Moment dabei, alles, was gut und teuer ist, bezüglich XML umzukrempeln, ob dies Sinn macht oder nicht..." Don Box, Essential XML www.develop.com/books/essentialXML 5 XSLT © 2002 Orientation in Objects GmbH Die Quelle als XML <?xml version="1.0" encoding="ISO-8859-1"?> <cdliste> .. <cd id="65" jahr="2000"> <titel>Music</titel> <interpret>Madonna</interpret> <hersteller>BMG</hersteller> <preis/> <track id="01"> <titel>Music</titel> <laenge>4:35</laenge> </track> <track id="02"> <titel>Impressive Instant</titel> <laenge>5:10</laenge> </track> </cd> ... </cdliste> 6 XSLT © 2002 Orientation in Objects GmbH 3 XSL - eXtensible Stylesheet Language • Bestand aus zwei Teilen: – Der Transformationssprache XSLT • Ändern der Struktur • Hinzufügen von Formatierungsanweisungen – XML Vokabular für Formatierungen • Darstellungsform XSL Transformation XSL Formatierer PDF ... XML-Quellbaum XML-Zielbaum 7 XSLT © 2002 Orientation in Objects GmbH XSLT © 2002 Orientation in Objects GmbH XSL im Browser Server XML XSL 8 4 XSL im Browser Vorteile: • Trennung von Content und Style • Suchmaschinen könnten XML Daten auswerten • XML Daten können von Fremdsystemen eingelesen und verwertet werden Nachteile: • Menge der übertragenen Informationen • Browser muss XSL unterstützen 9 XSLT © 2002 Orientation in Objects GmbH Von XSL zu XSLT XSLT eXtensible Stylesheet Language for Transformation Transformationsanweisungen XPath Adressierung Formatierung XSL-FO eXtensible Stylesheet Language - Formatting Objects 10 XSLT © 2002 Orientation in Objects GmbH 5 XSLT Prozessor + Transformationen csv.xsl html.xsl txt.xsl news.html docbook.xsl news.txt XSLT Prozessor news.xml news.csv (Xalan, Saxon, ..) docbook.xml 11 XSLT © 2002 Orientation in Objects GmbH XML-Transformationen mit Bäumen Stylesheet Datei Stylesheet XSLT Prozessor XML Datei Quelle Output Datei Output 12 XSLT © 2002 Orientation in Objects GmbH 6 Transformation in verschiedene Formate HTML Text CSV XML 13 XSLT © 2002 Orientation in Objects GmbH Überblick • • • • • • • • XSLT Einführung Stylesheets XPath Advanced XSLT Anwendungen PDF Erzeugung Erzeugung von Grafiken XSLT Praxis Techniken und Beispiele 14 XSLT © 2002 Orientation in Objects GmbH 7 XSLT im Detail • Was ist XSLT (nicht)? – XSLT ist eine funktionale Sprache, um XML-Dokumente zu transformieren – XSLT ist erweiterbar – „XSLT makes XML useful for non-programmers“ (James Clark) • Ein XSLT-Dokument ist – selbst ein XML-Dokument – Eine Anleitung zur Transformation in ein Ergebnisdokument 15 XSLT © 2002 Orientation in Objects GmbH Aufbau des ersten Stylesheets <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html><body> <h1><xsl:value-of select="/cdliste/listentitel"/></h1> <p><xsl:value-of select="/cdliste/erstelldatum"/></p> <p><xsl:value-of select="/cdliste/beschreibung"/></p> </body></html> </xsl:template> </xsl:stylesheet> 16 XSLT © 2002 Orientation in Objects GmbH 8 Namespace • Deklariert einen Namensraum für Elemente • Wird durch URI gekennzeichnet • XSLT hat Namespace xmlns:xsl="http://www.w3.org/1999/XSL/Transform“ • XSLT-Prozessor wertet nur Elemente diesen Namespaces aus <... xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 17 XSLT © 2002 Orientation in Objects GmbH <xsl:for-each select=“xyz”> • • • • Befehle werden in einer Schleife abgehandelt Schleife läuft für jedes Element der select-Anweisung Gebräuchlich für Listen In jedem Durchlauf wird der Knoten zum Kontextknoten <xsl:for-each select="cdliste/cd"> mache dies mache das </xsl:for-each> 18 XSLT © 2002 Orientation in Objects GmbH 9 Die erste Schleife <xsl:for-each select="//cd"> <xsl:value-of select="titel"/>, <xsl:value-of select="interpret"/><br/> </xsl:for-each> 19 XSLT © 2002 Orientation in Objects GmbH Inhalt des Context <xsl:for-each select="//cd"> <xsl:value-of select="titel"/> Context = cd <xsl:for-each select="tracks/track"> <xsl:value-of select="laenge"/> <xsl:value-of select="titel"/> Context = track </xsl:for-each> <xsl:value-of select="preis"/> Context = cd </xsl:for-each> 20 XSLT © 2002 Orientation in Objects GmbH 10 Zweite Schleife <xsl:for-each select="tracks/track" > <xsl:value-of select="laenge"/> <xsl:value-of select="titel"/><br/> </xsl:for-each> 21 XSLT © 2002 Orientation in Objects GmbH <xsl:if test=“xyz”> • <xsl:if> gibt die Möglichkeit eine Bedingung abzuprüfen. • Ist der Test erfolgreich, werden die Anweisungen ausgeführt. <xsl:if test="position()=last()"> mache dies tue das </xsl:if> 22 XSLT © 2002 Orientation in Objects GmbH 11 <xsl:choose> • Dient zum Überprüfen auf mehrere Kriterien • Der Choose Befehl hat zwei Unterelemente: – <xsl:when test="xyz"> – <xsl:otherwise> • Die when-Anweisung kann beliebig oft in “choose” auftauchen, otherwise jedoch nur einmal 23 XSLT © 2002 Orientation in Objects GmbH <xsl:choose> Beispiel: <xsl:choose> <xsl:when test="Bedingung1"> tue dies </xsl:when> <xsl:when test="Bedingung2"> tue das </xsl:when> <xsl:otherwise> mach was anderes </xsl:otherwise> </xsl:choose> 24 XSLT © 2002 Orientation in Objects GmbH 12 Conditions <xsl:if test="preis"> Preis: DM <xsl:value-of select="preis"/><br/> </xsl:if> 25 XSLT © 2002 Orientation in Objects GmbH Überblick • • • • • • • • XSLT Einführung Stylesheets XPath Advanced XSLT Anwendungen PDF Erzeugung Erzeugung von Grafiken XSLT Praxis Techniken und Beispiele 26 XSLT © 2002 Orientation in Objects GmbH 13 XPath • • • • • Spezifiziert Adressierung eines XML-Dokumentes Enthält 13 Achsenbezeichner (AxisName) es existieren Kurz- und Langformen zur Adressierung W3C Recommendation seit 16. November 1999 Gemeinsame Syntax für Funktionalitäten, die sich XSLT und Xpointer( www.w3c.org/tr/xptr ) teilen 27 XSLT © 2002 Orientation in Objects GmbH NodeSet • Eine Menge von Knoten des Dokumentes • Listet Knoten eines XPath-Ausdruckes auf node set <xsl:for-each select="cd"> 28 XSLT © 2002 Orientation in Objects GmbH 14 Axis Names eine kleine “Baumschule” <cdliste> <erstelldatum>14.01.2001</erstelldatum> <listentitel>OIO CD-Liste</listentitel> <beschreibung>Diese CD-Liste ist... </beschreibung> <cd id="65" jahr="2000"> <titel>Music</titel> <interpret>Madonna</interpret> <hersteller>BMG</hersteller> <preis>19.99</preis> <track id="01“> <titel>Music</titel> <laenge>4:35</laenge> </track> ... </cd> ... 29 XSLT © 2002 Orientation in Objects GmbH Anwendung von XPathausdrücken • Ausdrücke werden immer angegeben wenn es um die Adressierung in der Quelle geht <xsl:template match=“titel"> <xsl:apply-templates select="/cdliste/cd"/> <xsl:value-of select="/cdliste/cd/titel"/> <xsl:for-each select="following-sibling::cd"> 30 XSLT © 2002 Orientation in Objects GmbH 15 Achsen (Auszug) cdliste parent cd preceeding-sibling tracks track track cd following-sibling child titel titel cd interpret preis track 31 XSLT © 2002 Orientation in Objects GmbH Location step Ein Step besteht aus Achsennamen und Knotentest AxisName::NodeTest cdliste parent::cdliste parent::node() cd cd tracks track track cd titel titel interpret preis track XSLT 32 © 2002 Orientation in Objects GmbH 16 Location step II Ein Step besteht aus Achsennamen und Knotentest AxisName::NodeTest cdliste following-sibling::cd following-sibling::node() cd cd tracks track track cd titel titel interpret preis track XSLT 33 © 2002 Orientation in Objects GmbH Location step und Location path Location step Location path Location step <xsl:value-of select="/cdliste/cd/hersteller"/> <xsl:value-of select="/cdliste/child::cd/child::hersteller"/> <xsl:value-of select="/descendant::hersteller"/> 34 XSLT © 2002 Orientation in Objects GmbH 17 Verschiedene Pfade 35 XSLT © 2002 Orientation in Objects GmbH Adressierung innerhalb eines Knotens Node Namespace Attribute1 Text Attribute2 Attribute3 <oio:seminar von="1" bis="2" mit="3">Das Sem...</oio:seminar> 36 XSLT © 2002 Orientation in Objects GmbH 18 Beispiel bei text() • Die Quelle: <mes>Hier stehen <b>wichtige</b>Informationen!</mes> • Das Stylesheet: <xsl:template match="mes"> <xsl:value-of select="text()"/> </xsl:template> • Das Resultat: mes Hier stehen Informationen b Hier stehen wichtige 37 XSLT © 2002 Orientation in Objects GmbH Beispiele <xsl:value-of select="//cd/attribute::jahr"/> <xsl:value-of select="//cd/titel/child::text()"/> 38 XSLT © 2002 Orientation in Objects GmbH 19 Prädikate Menge aller CD Elemente mit Interpret Madonna Gefiltertes Node Set cd[interpret=‘Madonna‘] Menge aller CD Elemente Node Set des NodeTestes 39 XSLT © 2002 Orientation in Objects GmbH Kontext in einem Prädikat //cd[interpret=‘Madonna‘] Context = gesamter Baum Context = aktuelle cd 40 XSLT © 2002 Orientation in Objects GmbH 20 Prädikate üben • //cd[preis] • //cd[@jahr < 1997] bzw. //cd[@jahr &lt; 1997] • //cd[@jahr > 1997 and @jahr <= 2000]/titel • Wie bekommt man alle cd´s die billiger sind als DM 20? • Wie bekomme ich alle cd´s die ein Lied mit der Länge 4:23 enthalten? 41 XSLT © 2002 Orientation in Objects GmbH Rechnen und Vergleichen Funktion =,<,<=,>,>=,!= and, or, not(ausdruck) +, -, *, div Zweck Vergleiche Boolsche Operatoren Numerische Operatoren 42 XSLT © 2002 Orientation in Objects GmbH 21 Funktionen (Auszug) Funktion Zweck position() Knoten auf Position prüfen last() Gibt den letzten Knoten zurück count(node-set) Anzahl der Knoten ermitteln sum(node-set) Summiert alle Knoten auf substring-after(‘Hallo‘,‘a‘) Gibt einen Teilstring zurück (->‘llo‘) sum(node-set) Summiert alle Knoten auf <xsl:value-of select="count(//cd)"/> 43 XSLT © 2002 Orientation in Objects GmbH Euro-Einführung EUR <xsl:value-of select="preis div 1.95583"/><br/> <h2>Der Durchschnittspreis ist: DM <xsl:value-of select="format-number(sum(//preis) div count(//preis), '0.00')"/> </h2> 44 XSLT © 2002 Orientation in Objects GmbH 22 Überblick • • • • • • • • XSLT Einführung Stylesheets XPath Advanced XSLT Anwendungen PDF Erzeugung Erzeugung von Grafiken XSLT Praxis Techniken und Beispiele 45 XSLT © 2002 Orientation in Objects GmbH Document Order - Leserichtung 1 2 9 3 4 5 6 8 10 11 12 7 46 XSLT © 2002 Orientation in Objects GmbH 23 <xsl:template match=“xyz” > • Es taucht als child von <xsl:stylesheet> auf • Besteht aus zwei Bestandteilen – Ein Pattern, welches auf Knoten des Sourcetrees angewandt wird – Ein Template, welches instanziiert werden kann, damit es Bestandteil des Resulttrees wird Matchpattern <xsl:template match="hersteller"> <b>Ein Hersteller</b> </xsl:template> Ausgabe 47 XSLT © 2002 Orientation in Objects GmbH <xsl:apply-templates/> • Anweisung für Prozessor mit Transformation fort zu fahren • Andere Regeln werden gesucht und abgearbeitet • Danach wird in der ursprünglichen Regel weiter gemacht <xsl:template match="cd"> <p> <xsl:apply-templates/> </p> </xsl:template> <xsl:template match="hersteller"> <b>Ein Hersteller</b> </xsl:template> 48 XSLT © 2002 Orientation in Objects GmbH 24 <xsl:apply-templates select=“xyz”/> • Anweisung für Prozessor mit Transformation fort zu fahren • Attribut select=“xyz” wählt die Child-Knoten aus • Danach wird in der ursprünglichen Regel weiter gemacht <xsl:template match="cd"> <p> <xsl:apply-templates select="hersteller"/> </p> </xsl:template> <xsl:template match="hersteller"> <b>Ein Hersteller</b> </xsl:template> 49 XSLT © 2002 Orientation in Objects GmbH Build-In Template Rules <xsl:template match="* | /"> <xsl:apply-templates/> </xsl:template> <xsl:template match="text() | @*"> <xsl:value-of select="."/> </xsl:template> 50 XSLT © 2002 Orientation in Objects GmbH 25 Bestehende Anwendung modularisieren 1 <xsl:template match="/"> <html><body> <xsl:apply-templates/> </body></html> </xsl:template> <xsl:template match="listentitel"> <h1><xsl:value-of select="."/></h1> </xsl:template> <xsl:template match="erstelldatum | beschreibung"> <p><xsl:value-of select="."/></p> </xsl:template> 51 XSLT © 2002 Orientation in Objects GmbH Bestehende Anwendung modularisieren 2 <xsl:template match="cd"> <xsl:apply-templates select="titel | interpret | preis"/> ... </xsl:template> <xsl:template match="titel | interpret"> <h2><xsl:value-of select="."/><br/></h2> </xsl:template> <xsl:template match="preis"> Preis: DM <xsl:value-of select="."/><br/> </xsl:template> <xsl:template match="preis[. &lt; 20]"> Sonderpreis: DM <xsl:value-of select="."/><br/> </xsl:template> 52 XSLT © 2002 Orientation in Objects GmbH 26 Bestehende Anwendung modularisieren 3 <xsl:template match="cd"> <xsl:apply-templates select="titel | interpret | preis"/> ... </xsl:template> <xsl:template match="titel | interpret"> <h2><xsl:value-of select="."/><br/></h2> </xsl:template> <xsl:template match="preis"> Preis: DM <xsl:value-of select="."/><br/> </xsl:template> <xsl:template match="preis[. &lt; 20]"> Sonderpreis: DM <xsl:value-of select="."/><br/> </xsl:template> 53 XSLT © 2002 Orientation in Objects GmbH <xsl:variable name=“xyz”> • Definiert globale und lokale Variablen • Lokale Variablen sind nur im jeweiligen Template sichtbar • Anwendung erfolgt über “$Name”. Definition: <xsl:variable name="city">London</xsl:variable> Anwenden: <xsl:value-of select="$city"/> 54 XSLT © 2002 Orientation in Objects GmbH 27 <xsl:param name=“xyz”> • • • • Als Top-Level-Element definiert es globale Parameter Innerhalb eines Templates deklariert es lokale Parameter “name” kennzeichnet den Namen des Parameters Anwenden erfolgt über “$Name”. XSLT-Proz Definition: <xsl:param name="city"> London </xsl:param> Template Anwenden: <xsl:value-of select="$city"/> Template Stylesheet 55 XSLT © 2002 Orientation in Objects GmbH <xsl:with-param name=“..”> • Übergabe eines Parameters bei – <xsl:call-template> oder – <xsl:apply-templates> • Kann nur als Child von o.g. template-Aufrufen auftreten <xsl:call-template name="Hauptstadt"> <xsl:with-param name="city">London</xsl:with-param> </xsl:call-template> 56 XSLT © 2002 Orientation in Objects GmbH 28 <xsl:attribute name="xyz"> • Attribute können auch dynamisch angelegt werden <xsl:template match="cd"> <img> <xsl:attribute name="src"> <xsl:value-of select="titel"/>.jpg </xsl:attribute> </img> </xsl:template> <img src="Music.jpg"/> 57 XSLT © 2002 Orientation in Objects GmbH Attribute Value Templates • Beispiel: Die Quelldatei <bild> <href>blume.jpg</href> <size width="300"/> </bild> • Das zugehörige Stylesheet: <xsl:variable name="bild-dir">/images</xsl:variable> ... <xsl:template match="bild"> <img src="{$bild-dir}/{href}" width="{size/@width}"/> </xsl:template> • Ergebnis: <img src="/images/blume.jpg" width="300"/> 58 XSLT © 2002 Orientation in Objects GmbH 29 Anwendung <xsl:variable name="farbe"> <xsl:if test="position() mod 2 = 1">orange</xsl:if> </xsl:variable> 59 XSLT © 2002 Orientation in Objects GmbH Überblick • • • • • • • • XSLT Einführung Stylesheets XPath Advanced XSLT Anwendungen PDF Erzeugung Erzeugung von Grafiken XSLT Praxis Techniken und Beispiele 60 XSLT © 2002 Orientation in Objects GmbH 30 BME-Cat <?xml version="1.0" encoding="iso-8859-1"?> <BMECAT version="1.2"> <T_NEW_CATALOG> <ARTICLE> <SUPPLIER_AID>GTH 0015208</SUPPLIER_AID> <ARTICLE_DETAILS> <DESCRIPTION_SHORT>Injektionspflaster, 1,2cm</DESCRIPTION_SHORT> <MANUFACTURER_NAME>Gothaplast</MANUFACTURER_NAME> <REMARKS>1,2cm * 4cm</REMARKS> </ARTICLE_DETAILS> <ARTICLE_ORDER_DETAILS> <ORDER_UNIT>Paket</ORDER_UNIT> </ARTICLE_ORDER_DETAILS> <ARTICLE_PRICE_DETAILS> <ARTICLE_PRICE type="Festpreis"> <PRICE_AMOUNT>18.0</PRICE_AMOUNT> </ARTICLE_PRICE> </ARTICLE_PRICE_DETAILS> </ARTICLE> ... 61 XSLT © 2002 Orientation in Objects GmbH Erzeugen mehrerer Outputfiles • Outputmöglichkeiten mittels <xsl:output method="...">: – XML – HTML – reiner Text (Stringwerte aller Knoten) • • Erzeugen mehrerer Outputfiles mittels <xsl:document href="...">, wobei href den Pfad angibt (absolut oder relativ), wo das Dokument gespeichert werden soll Es exisitiert ein Hauptdokument, jeder mit <xsl:document href="..."> eingeleitete Abschnitt stellt ein untergeordnetes Dokument dar, es ensteht eine Baumstruktur 62 XSLT © 2002 Orientation in Objects GmbH 31 Mehrere Outputs <xsl:for-each select="//ARTICLE" > <redirect:write file="{generate-id(.)}.html"> <html> <body> .... </body> </html> </redirect:write> </xsl:for-each> 63 XSLT © 2002 Orientation in Objects GmbH Verlinkung der Detailansichten <tr style="background:lightgrey"> <td> <a href="{generate-id(preceeding-sibling::ARTICLE[1])}.html"> vorheriger </a> </td> <td> <a href="{generate-id(following-sibling::ARTICLE[1])}.html"> nächster </a> </td> </tr> 64 XSLT © 2002 Orientation in Objects GmbH 32 Verschiedene Outputs 65 XSLT © 2002 Orientation in Objects GmbH Idee: XSLT im Servlet Web Server Servlet Engine XSLT Prozessor XML XSL XSL Dokument Sheets Sheets XSL XSL XSL Sheets Sheets Sheets XSLT 66 © 2002 Orientation in Objects GmbH 33 Generierung im Batch Vorteile: • Schnelle Bearbeitung von Abrufen • Konventioneller Web Server ist ausreichend • Robuster im Betrieb Nachteile: • Keine dynamische Seitengenerierung 67 XSLT © 2002 Orientation in Objects GmbH Gruppieren in XSLT <xsl:for-each select="//interpret[not(.= preceding::interpret)]"> <xsl:for-each select="//CD[interpret=current()]"> Madonna Madonna Music Music Madonna Ray of light Ray of light Frozen Eminem Eminem Marshall Mathers Marshall Mathers Madonna Eminem Frozen Britney Spears Britney Spears Baby one more.. Baby one more.. Eminem Eminem 68 XSLT © 2002 Orientation in Objects GmbH 34 CD-Liste gruppieren 69 XSLT © 2002 Orientation in Objects GmbH Keys: Key-Tabellen definieren Quelldokument <xsl:key name="cds" match="cd" use="interpret"/> Stylesheet “cds“ Schlüsseltabelle documentorder Schlüssel Knoten Madonna cd Madonna cd Eminem cd Eminem cd Britney Spears cd Eminem cd ... cd 70 XSLT © 2002 Orientation in Objects GmbH 35 Verwendung von Key-Tabellen Beispiel: Schleife über Nodeset Nodeset mit allen Knoten zum Schlüssel <xsl:for-each select="key('cds', 'Madonna')"> ... </xsl:for-each> Name der Key-Tabelle gesuchter String 71 XSLT © 2002 Orientation in Objects GmbH XSLT © 2002 Orientation in Objects GmbH CD-Liste gruppieren 72 36 Identifikation: generate-id() • generate-id() weist einem Knoten eine eindeutige ID zu. <xsl:value-of select="generate-id(.)"/> • Ausgabe bei Saxon: Music(b1b1b2) Ray of light(b1b1b4) Marshall Mathers(b1b1b6) Eminem(b1b1b8) baby one more time(b1b1c10) 73 XSLT © 2002 Orientation in Objects GmbH Identifikation: Erstes Element finden • Bilden der eigenen id • Vergleich mit Eintrag aus der Key-Tabelle • Nur erster Eintrag wird angezeigt cdliste cd interpret cd titel interpret cd titel cd[generate-id(.)=generate-id(key('cds', interpret))] id von Context-Knoten erste id aus Key-Tabelle 74 XSLT © 2002 Orientation in Objects GmbH 37 Gruppieren nach Muench: Beispiel ... <xsl:key name="cds" match="cd" use="interpret"/> ... <xsl:template match="/"> <xsl:for-each select="//cd[generate-id(.)= generate-id(key('cds', interpret)[1])]"> <xsl:value-of select="interpret"/><br/> <xsl:for-each select="key('cds', interpret)"> Titel: <xsl:value-of select="titel"/><br/> Hersteller: <xsl:value-of select="hersteller"/><br/> </xsl:for-each> <br/> </xsl:for-each> </xsl:template> ... 75 XSLT © 2002 Orientation in Objects GmbH Muench´sche Methode: Ausgabe Madonna Titel: Music Hersteller: BMG Titel: Ray of light Hersteller: BMG Eminem Titel: Marshall Mathers Hersteller: Sony Titel: Eminem Hersteller: Sony Britney Spears Titel: Baby one more time Hersteller: Sony 76 XSLT © 2002 Orientation in Objects GmbH 38 XSLT-Performance • • • • Wozu wird XSLT genutzt ? Kleiner Input Stylesheets vorher übersetzen Prozessorinitialisierung 77 XSLT © 2002 Orientation in Objects GmbH Faustregeln • Kein //item • mehrfache Nutzung von Nodesets • <xsl:number...> • preceding, following axes 78 XSLT © 2002 Orientation in Objects GmbH 39 XSLT-Performance 20 sec/Mb Simple optimization Advanced optimization 5 sec/Mb 1 sec/Mb Quelle: Michael Kay:“Inside an XSLT Processor“ 19.5.2000 To day http://www9.org/devday-xml/session3/kay.ppt 79 XSLT © 2002 Orientation in Objects GmbH XSLT-Performance • Verschiedene Implementierungen • • • • • • • • • • • • • MSXML http://msdn.microsoft.com/xml/general/xmlparser.asp Sablotron http://www.gingerall.com/charlie-bin/get/webGA/act/sablotron.act Saxon http://saxon.sourceforge.net/ TransforMiiX http://www.mozilla.org/projects/xslt/ Xalan-Java http://xml.apache.org/xalan/ Xalan-C++ http://xml.apache.org/xalan-c/ XT http://xml.apache.org/xalan-c/ Oracle Java http://technet.oracle.com/tech/xml/parser_java2/index.htm Four Thought http://www.fourthought.com/4SuiteServer/index.html Sun's XSLTC : http://www.sun.com/xml/developers/xsltc/ LibXSLT http://xmlsoft.org/ jd.xslt http://www.aztecrider.com/xslt/download.html Infoteria iXSLT http://www.infoteria.com/en/contents/product/ixslt/index.html • Benchmarking • http://www.datapower.com/XSLTMark/ Quelle:Eugne Kuznetzov, Curys Dolph http://www.datapower.com/XSLTMark/res_2001_04_01.html 80 XSLT © 2002 Orientation in Objects GmbH 40 Inkludieren von Stylesheets • • • • Erfolgt über <xsl:include href=“xyz.xsl"> Ist ein top-level Element Besitzt ein href-Attribut mit der entsprechenden URI Bei Inkludierte Template-Rules gibt es keine Unterscheidung nach Prioritäten (im Gegensatz zu Importierten) <xsl:stylesheet version="1.0“ xmlns:xsl=“..."> <xsl:include href="article.xsl"/> <xsl:include href="bigfont.xsl"/> ... </xsl:stylesheet> 81 XSLT © 2002 Orientation in Objects GmbH Importieren von Stylesheets • • • • • Ist ein top-level Element Besitzt ein href-Attribut mit der entsprechenden URI Beim Import mehrerer Stylesheets formt sich ein Importbaum Später importierte Stylesheets haben eine höhere Priorität Selber geschriebene Templates überschreiben importierte <xsl:stylesheet version="1.0“ xmlns:xsl=“..."> <xsl:import href="article.xsl"/> <xsl:import href="bigfont.xsl"/> ... </xsl:stylesheet> 82 XSLT © 2002 Orientation in Objects GmbH 41 Modularisierung von Stylesheets <xsl:include href="a.xsl"/> <xsl:import href="b.xsl"/> Stylesheet Template A XYZ B C XYZ XYZ D E F XYZ XYZ XYZ 83 XSLT © 2002 Orientation in Objects GmbH Transformation mehrerer Dokumente • • • • Zugriff auf andere XML-Dokumente mittels der Funktion document(...) Als Argument wird ein XML-Dokument übergeben, das die einzufügenden Knoten enthält Eine Erweiterung der XPath-Funktionen Reihenfolge der Knoten abhängig von Implementierung ... <xsl:template match="/"> <xsl:value-of select="document('CDListe.xml')"/> </xsl:template> ... 84 XSLT © 2002 Orientation in Objects GmbH 42 Einfügen eines Menues <html><body> <table> <tr> <td valign="top"> <xsl:apply-templates select="document('navigation.xml')/navigation"/> </td> <td> <xsl:apply-templates/> </td> </tr> </table> </body></html> 85 XSLT © 2002 Orientation in Objects GmbH Überblick • • • • • • • • XSLT Einführung Stylesheets XPath Advanced XSLT Anwendungen PDF Erzeugung Erzeugung von Grafiken XSLT Praxis Techniken und Beispiele 86 XSLT © 2002 Orientation in Objects GmbH 43 XSL Formatting Objects • XSL-FO stellt die zweite Hälfte der XSL Spec. • Final Recommondation seit 15.Oktober 2001 • besteht aus 56 definierten FO-Elementen und über 100 Attributen • Formatting Objects beheben die Nachteile einer Bildschirmausgabe, die vom Browser o.ä. abhängt und liefert für die Druckausgabe optimierte Dokumente • FOP ist eine Implementierung der ASF 87 XSLT © 2002 Orientation in Objects GmbH Aufbau eines FO-Dokuments <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="my-page"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="my-page"> <fo:flow flow-name="xsl-region-body"> <fo:block>Hier steht Text...</fo:block> </fo:flow> </fo:page-sequence> </fo:root> 88 XSLT © 2002 Orientation in Objects GmbH 44 Ausgabe in PDF 89 XSLT © 2002 Orientation in Objects GmbH Überblick • • • • • • • • XSLT Einführung Stylesheets XPath Advanced XSLT Anwendungen PDF Erzeugung Erzeugung von Grafiken XSLT Praxis Techniken und Beispiele 90 XSLT © 2002 Orientation in Objects GmbH 45 Was ist SVG - Scalable Vector Graphics? • Standardisiertes Grafikformat • Aktueller Stand: – SVG 1.0 W3C 4. September 2001 • 2D Vektor und mixed Vektor/Raster Grafik • XML Anwendung • SVG Grafiken können animiert, interaktiv und dynamisch sein 91 XSLT © 2002 Orientation in Objects GmbH SVG Viewer & Editoren • Adobe – www.adobe.de/svg • IBM SVG View – http://www.alphaworks.ibm.com/tech/svgview • Apache Batik Project – http://xml.apache.org/batik • Jasc WebDraw – http://www.jasc.com/products/webdraw 92 XSLT © 2002 Orientation in Objects GmbH 46 Hello World als SVG • Beispiel ist eine SVG Grafik • Ausrichtung eines Textes an einem Pfad 93 XSLT © 2002 Orientation in Objects GmbH Sourcecode zu „Hello World“ <?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20001102//EN" "http://www.w3.org/TR/2000/CR-SVG-20001102/DTD/svg-20001102.dtd"> <svg width="10cm" height="3cm" viewBox="0 0 1000 300"> <defs> <path id="MyPath" d="M 100 200 C 200 100 300 0 400 100 C 500 200 600 300 700 200 C 800 100 900 100 900 100"/> </defs> <desc>Hello World</desc> <use xlink:href="#MyPath" style="fill:none; stroke:red" /> <text style="font-family:Verdana; font-size:60; fill:blue"> <textPath xlink:href="#MyPath"> Hello Scalable Vector Graphics </textPath> </text> </svg> 94 XSLT © 2002 Orientation in Objects GmbH 47 Dynamisches SVG 95 XSLT © 2002 Orientation in Objects GmbH Überblick • • • • • • • • XSLT Einführung Stylesheets XPath Advanced XSLT Anwendungen PDF Erzeugung Erzeugung von Grafiken XSLT Praxis Techniken und Beispiele 96 XSLT © 2002 Orientation in Objects GmbH 48 Stylesheet Design-Ansätze nach Kay • • • • Fill-in-the-blanks Stylesheet Navigational Stylesheet Rule-Based Stylesheet Computational Stylesheet (Siehe Michael Kay „XSLT Programmer‘s Reference“ Kapitel 8) 97 XSLT © 2002 Orientation in Objects GmbH Fill-in-the-blanks Stylesheet • Einfach • HTML mit XSLT Befehlen • Stylesheet gleicht in der Struktur dem Output 98 XSLT © 2002 Orientation in Objects GmbH 49 Fill-in-the-blanks Stylesheet: Beispiel <html xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:version="1.0"> <head> <title>CD Liste</title> </head> <body> <xsl:for-each select="cdliste/cd"> <b><xsl:value-of select="interpret"/></b> :<xsl:value-of select="titel"/><br/> </xsl:for-each> </body> </html> 99 XSLT © 2002 Orientation in Objects GmbH Fill-in-the-blanks Stylesheet: Ausgabe Ausgabe mit cdliste.xml: Madonna: Music Madonna: Ray of light Eminem: Marshall Mathers Eminem: Eminem Britney Spears: baby one more time 100 XSLT © 2002 Orientation in Objects GmbH 50 Navigational Stylesheet • Fortführung des Fill-in-the-blanks Stylesheet • Output orientiert • Kann enthalten – Named Templates, Variablen, keys, Conditionals, ... • Gleicht prozeduralem Programm • Enthält xsl:stylesheet und xsl:template Tags • Es wird vorgegeben, wo die Knoten im Source gefunden werden können • Erfordert starre Struktur des Inputs 101 XSLT © 2002 Orientation in Objects GmbH Navigational Stylesheet: Beispiel <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html><body> <xsl:for-each select="cdliste/cd"> <br/><b><xsl:value-of select="interpret"/></b> <xsl:call-template name="getTitel"> <xsl:with-param name="id" select="@id"/> </xsl:call-template> </xsl:for-each> </body></html> </xsl:template> <xsl:template name="getTitel"> <xsl:param name="id"/> <xsl:text> </xsl:text><xsl:value-of select="//cd[@id=$id]/titel"/> </xsl:template> </xsl:stylesheet> 102 XSLT © 2002 Orientation in Objects GmbH 51 Rule-Based Stylesheet • Besteht vorwiegend aus Regeln, wie bestimmte Dinge aus der Quelle verarbeitet werden sollen • Macht nur wenige Vermutungen über Quelle und Output • Anwendung: Bei wenig bekannter oder flexibler Struktur der Quelle • Teile können gut wiederverwendet werden 103 XSLT © 2002 Orientation in Objects GmbH Rule-Based Stylesheet <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html><body> <xsl:apply-templates/> </body></html> </xsl:template> <xsl:template match="interpret"> <b><xsl:value-of select="."/></b><br/> </xsl:template> <xsl:template match="titel"> <xsl:value-of select="."/> </xsl:template> </xsl:stylesheet> 104 XSLT © 2002 Orientation in Objects GmbH 52 Computational Stylesheet • Struktur der Quelle stimmt nicht mit Output überein • Anwendung: – Umformatierung, Aggregation • Verwendet Anteile der funktionalen Programmierung 105 XSLT © 2002 Orientation in Objects GmbH Exkurs: Funktionale Programmierung • • • • Ohne Zuweisungen Zuweisungen erzwingen bestimmten Programmablauf Seiteneffekte werden vermieden Rekursionen ersetzen Schleifen 106 XSLT © 2002 Orientation in Objects GmbH 53 Computational Stylesheet: Beispiel Quelle: <keywords>XML XSLT XPath XPointer</keywords> Output: <keyword>XML</keyword> <keyword>XSLT</keyword> <keyword>XPath</keyword> <keyword>XPointer</keyword> 107 XSLT © 2002 Orientation in Objects GmbH Computational Stylesheet: Beispiel Ablauf tokenToElement(“XML XSLT XPath XPointer “) Ausgabe XML XSLT XPath XPointer tokenToElement(“XSLT XPath XPointer “) XSLT Ausgabe XPath XPointer tokenToElement(“XPath XPointer “) XPath Ausgabe XPointer tokenToElement(“XPointer “) XPointer Ausgabe tokenToElement(“ “) Abbruch 108 XSLT © 2002 Orientation in Objects GmbH 54 Computational Stylesheet: Beispiel Rekursives Template <xsl:template match="keywords" name="tokenToElement"> <xsl:param name="words" select="concat(.,' ')"/> <xsl:choose> <xsl:when test="string-length($words) > 1"> <keyword> <xsl:value-of select="substring-before($words,' ')"/> </keyword> <xsl:call-template name="tokenToElement"> <xsl:with-param name="words" select="substring-after($words,' ')"/> </xsl:call-template> </xsl:when> </xsl:choose> </xsl:template> 109 XSLT © 2002 Orientation in Objects GmbH Aufgabe: CDs mit Preis kennzeichnen 110 XSLT © 2002 Orientation in Objects GmbH 55 Lösung: Condition & Variable <xsl:template match="cd"> <xsl:variable name="farbe"> <xsl:choose> <xsl:when test="preis">orange</xsl:when> <xsl:otherwise>lightgrey</xsl:otherwise> </xsl:choose> </xsl:variable> <tr style="background: {$farbe}"> <td><xsl:value-of select="titel"/></td> </tr> </xsl:template> 111 XSLT © 2002 Orientation in Objects GmbH Lösung: Condition <xsl:template match="cd"> <tr> <xsl:attribute name="style"> background: <xsl:choose> <xsl:when test="preis">orange</xsl:when> <xsl:otherwise>lightgrey</xsl:otherwise> </xsl:choose> </xsl:attribute> <td> <xsl:value-of select="titel"/> </td> </tr> </xsl:template> 112 XSLT © 2002 Orientation in Objects GmbH 56 Aufgabe: Zusätzlicher Knopf 113 XSLT © 2002 Orientation in Objects GmbH Lösung: Mehrere Conditions <xsl:template match="cd"> <tr> <xsl:attribute name="style"> background: <xsl:choose> <xsl:when test="preis">orange</xsl:when> <xsl:otherwise>lightgrey</xsl:otherwise> </xsl:choose> </xsl:attribute> <td> <xsl:value-of select="titel"/> <xsl:if test="preis"> <input type="button" value="bestellen"/> </xsl:if> </td> </tr> </xsl:template> 114 XSLT © 2002 Orientation in Objects GmbH 57 Lösung: Overloaded Matchtemplates <xsl:template match="cd"> <tr style="background: lightgrey"> <td><xsl:value-of select="titel"/></td> </tr> </xsl:template> <xsl:template match="cd[preis]"> <tr style="background: orange"> <td> <xsl:value-of select="titel"/> <input type="button" value="bestellen"/> </td> </tr> </xsl:template> 115 XSLT © 2002 Orientation in Objects GmbH Best Practise: Schleifen Mit Condition: <xsl:for-each select="cd"> <xsl:if test="@jahr=2000"> <xsl:value-of select="titel"/><br/> </xsl:if> </xsl:for-each> Besser mit Predikat: <xsl:for-each select="cd[@jahr=2000]"> <xsl:value-of select="titel"/><br/> </xsl:for-each> 116 XSLT © 2002 Orientation in Objects GmbH 58 Best Practise: Dynamische Attribute Mit Variable: <xsl:variable name=“path“> <xsl:call-template name="getDirPath"> <xsl:with-param name="node“ select="key('seiten',@name)"/> </xsl:call-template> </xsl:variable> <a href=“{$path}“>Link</a> 117 XSLT © 2002 Orientation in Objects GmbH Best Practise: Dynamische Attribute Besser mit Attribut-Tag: <a> <xsl:attribute name="href"> <xsl:call-template name="getDirPath"> <xsl:with-param name="node“ select="key('seiten',@name)"/> </xsl:call-template> </xsl:attribute> Link </a> 118 XSLT © 2002 Orientation in Objects GmbH 59 Fragen? ? ? ? ? ? http://www.oio.de/public 119 XSLT © 2002 Orientation in Objects GmbH Quellen • Specification XSLT 1.0 (recommendation) http://www.w3.org/TR/xslt.html • Specification XPath 1.0 (recommendation) http://www.w3.org/TR/xpath.html • Michael Key, XSLT - Programmer´s Reference WROX • XSLT-Tutorial ZVON.org http://www.zvon.org • XSL Frequently Asked Questions http://www.dpawson.co.uk/xsl/xslfaq.html • XSLT-Tutorial N.Walsh http://www.nwalsh.com/docs/tutorials/xsl/xsl/frames.html 120 XSLT © 2002 Orientation in Objects GmbH 60