Komplexe Transformationen mit XSLT



Ähnliche Dokumente
Komplexe Transformationen mit XSLT

Projektseminar "Texttechnologische Informationsmodellierung"

XML-Praxis. Mit XSLT arbeiten. Jörn Clausen

XSLT XSL Transformations

XSL Templates. Mit Templates arbeiten. XSL Templates

XML-Praxis. XML-Anwendungen. Jörn Clausen

Transformation von XML-Dokumenten. IDE SummerSchool 2013, Chemnitz

IT-Zertifikat: Daten- und Metadatenstandards. Transformation von XML-Dokumenten mit XSLT (und XPATH) XSLT kurz und knackig. XSLT und die Praxis

XSLT Vortrag. 2. Beispiel XML. 3. Anwendungsmöglichkeiten von XSLT 4. XHTML

XSL und XSLT. Inhalt. Mathias Heilig XSL Übersicht. Formatierungsprozess. Sprachbeschreibung. Vorführung Resümee

Rechnung Angebot Zeiterfassung

Handbuch zur Anlage von Turnieren auf der NÖEV-Homepage

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Klaus Schild, XML Clearinghouse Transformation von XML-Dokumenten

5.2 Neue Projekte erstellen

FIS: Projektdaten auf den Internetseiten ausgeben

teischl.com Software Design & Services e.u. office@teischl.com

Berechnungen in Access Teil I

Abamsoft Finos im Zusammenspiel mit shop to date von DATA BECKER

Excel-Anwendung Wartungsplan

ACHTUNG: Es können gpx-dateien und mit dem GP7 aufgezeichnete trc-dateien umgewandelt werden.

Bauteilattribute als Sachdaten anzeigen

5. Übung: PHP-Grundlagen

Im Folgenden wird Ihnen an einem Beispiel erklärt, wie Sie Excel-Anlagen und Excel-Vorlagen erstellen können.

Leitfaden #1a. "zanox Publisher-Statistik" (next generation)

Tipps & Tricks Neuerungen Nr. 5/ Externe Web-Shops im UniKat für Laborverbrauchsmaterial & Chemikalien

Diazo. XSLT basiertes Website Theming. Maik Derstappen Inqbus GmbH & Co. KG maik.derstappen@inqbus.de

Professionelle Seminare im Bereich MS-Office

Excel-Anwendung Lagerverwaltung

ARAkoll 2013 Dokumentation. Datum:

Das EDV-Cockpit mit MindManager für SharePoint

Dokumentation von Ük Modul 302

FreePDF XP. Dokumentation

Fusszeile mit Datumsfeld und Dateiname

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Kurzanleitung zur Bereitstellung von Sachverhalten und Lösungen zum Universitätsrepetitorium auf dem Server unirep.rewi.hu-berlin.

Word 2010 Schnellbausteine

1 topologisches Sortieren

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

Diese Ansicht erhalten Sie nach der erfolgreichen Anmeldung bei Wordpress.

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

myfactory.go! - Verkauf

Dokumentation für die software für zahnärzte der procedia GmbH Onlinedokumentation

Die Beschreibung bezieht sich auf die Version Dreamweaver 4.0. In der Version MX ist die Sitedefinition leicht geändert worden.

Zeichen bei Zahlen entschlüsseln

4 Aufzählungen und Listen erstellen

3. GLIEDERUNG. Aufgabe:

Bedienungsanleitung Anlassteilnehmer (Vereinslisten)

ARCWAY Cockpit 3.4. Standardbericht und Formatvorlagen. ReadMe

Erstellen eines HTML-Templates mit externer CSS-Datei

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1

Klausurteilnehmer. Wichtige Hinweise. Note: Klausur Informatik Programmierung, Seite 1 von 8 HS OWL, FB 7, Malte Wattenberg.

Standard-Kontaktformular

Verarbeitung der Eingangsmeldungen in einem Callcenter

Pixelart-W ebdesign.de

Arbeiten mit Standorten und Freimeldungen

1. So einfach ist der Excel-Bildschirm

Arbeitsschritte EAÜ Leistungserbringer Einnahmen erfassen

Anwendungsbeispiele Buchhaltung

Outlook Vorlagen/Templates

Schiller-Gymnasium Hof

Erstellen einer in OWA (Outlook Web App)

Bedienungsanleitung für den Online-Shop

How to do? Projekte - Zeiterfassung

.procmailrc HOWTO. zur Mailfilterung und Verteilung. Stand:

Web-Kürzel. Krishna Tateneni Yves Arrouye Deutsche Übersetzung: Stefan Winter

desk.modul : Intercompany

Ihre Interessentendatensätze bei inobroker. 1. Interessentendatensätze

Anleitung, WebRecherche

Informationsblatt Induktionsbeweis

-Inhalte an cobra übergeben

Summenbildung in Bauteiltabellen mit If Then Abfrage

Erklärung zum Internet-Bestellschein

Tevalo Handbuch v 1.1 vom

Excel Pivot-Tabellen 2010 effektiv

Kleines Handbuch zur Fotogalerie der Pixel AG

1 Einleitung. Lernziele. Diagramme zur Visualisierung von Daten erstellen. Diagramme formatieren Lerndauer. 4 Minuten.

EvaSys-Export (Stand )

Konvertieren von Settingsdateien

Anleitung zum erstellen einer PDF-Datei aus Microsoft Word

Audiobeiträge von Soundcloud anbieten am Beispiel von kirchenradio.de

Programmieren für mobile Endgeräte SS 2013/2014. Dozenten: Patrick Förster, Michael Hasseler

PROBLEME BEIM INSTALLIEREN REALTEK HD AUDIO TREIBER

SAP HANA-DATENBANK BENUTZERHANDBUCH FÜR DIE VERMESSUNG. SAP HANA-Datenbank Benutzerhandbuch für die Vermessung Version 1.1

EMIS - Langzeitmessung

Anleitung OpenCms 8 Inhaltstyp Kommentare

Professionelle Seminare im Bereich MS-Office

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Quartalsabrechnung! " " " " " " " Stufe 1! Beheben von Abrechnungsfehlern" Stufe 2! Neue Abrechnung erstellen"

Musterlösung für Schulen in Baden-Württemberg. Windows Basiskurs Windows-Musterlösung. Version 3. Stand:

Änderungen in Version 11. Kundenmaske 1. Weinmaske 2

Kapitalerhöhung - Verbuchung

Microsoft PowerPoint 2013 Folien gemeinsam nutzen

Virtueller Seminarordner Anleitung für die Dozentinnen und Dozenten

Umstellung des Vergütungsverfahrens externer Gutachter beim Versorgungsamt Hamburg

VoIP. Anleitung zur Nutzung des CCMUSER. VoIP Anleitung zur Nutzung des CCMUSER. 1) Einloggen

Transkript:

XML-Praxis Komplexe Transformationen mit XSLT Jörn Clausen joern@techfak.uni-bielefeld.de 1

Übersicht Sortieren XML erzeugen und weiterverarbeiten modes Daten aus mehreren XML-Dokumenten lesen 2

sorting Reihenfolge der Verarbeitung bestimmen: <xsl:apply-templates select="item"> <xsl:sort select="name"/> </xsl:apply-templates> Reihenfolge umkehren: <xsl:sort select="name" order="descending"/> nummerische Sortierung: <xsl:sort select="quant" data-type="number"/> mehrere Sortierkriteren möglich 3

Aufgaben Die Datei peanuts.xml enthält einige Namen. Gib sie z.b. als HTML-Liste aus. Sortiere sie dabei nach folgenden Eigenschaften: Vorname Nachname Geburtsjahr umgekehrt nach Vorname umgekehrte Dokumentreihenfolge Nachname und Vorname Verwende template in unordered list, sortiere nach Familiennamen: <xsl:apply-templates match="character"> <xsl:sort select="surname"/> </xsl:apply-templates> Erzeuge list item: <xsl:template match="character"> <li> <xsl:value-of select="name"/> <xsl:text> </xsl:text> <xsl:value-of select="surname"/> </li> </xsl:template> Alternative Sortierverfahren: <xsl:sort select="name"/> <xsl:sort select="@intro" data-type="number"/> <xsl:sort select="name" order="descending"/> <xsl:sort select="position()" order="descending" data-type="number"/> <xsl:sort select="surname"/> <xsl:sort select="name"/> 4

sorting, cont. auch in Schleife verwendbar: <xsl:for-each select="item"> <xsl:sort select="quant"/>... </xsl:for-each> nur am Anfang des Schleifenrumpfs 5

result tree fragments bereits gesehen: node set in Variable <xsl:variable name="tocsl" select="slide[title/@toc= yes ]"/> <xsl:for-each select="$tocsl"> statischen/generierten XML-Code in Variable ablegen: <xsl:variable name="footer"> <hr/> <address>generated with pres2html</address> </xsl:variable> erzeugt kein node set sondern result tree fragment einzige Möglichkeit in XSLT 1.0: <xsl:copy-of select="$footer"/> 6

Aufgaben Definiere zwei globale Variablen header und footer, die den HTML-Code für eine Kopf- und Fußzeile enthalten. Füge sie mit xsl:copy-of in die Ausgabe ein. Definiere einen globalen Parameter date, der beim Aufruf des XSLT-Prozessors übergeben wird: $ xsltproc --param date "2003-08-08"... Das Datum soll in der Fußzeile erscheinen. Definition: <xsl:param name="date"/> <xsl:variable name="header"> <address>peanuts Characters</address> <hr/> <h1>sorted List of Peanuts Characters</h1> </xsl:variable> <xsl:variable name="footer"> <hr/> <address>generated <xsl:value-of select="$date"/></address> </xsl:variable> Verwende die Variablen an den richtigen Stellen: <xsl:copy-of select="$header"/>... <xsl:copy-of select="$footer"/> 7

result tree fragments verarbeiten result tree fragment in node set umwandeln: <xsl:variable name="list"> <name>charlie Brown</name> <name>lucy van Pelt</name> <name>snoopy</name> </xsl:variable> <xsl:for-each select="exslt:node-set($list)/name"> vorher name space exslt deklarieren: xmlns:exslt="http://exslt.org/common" in den meisten XSLT-Prozessoren implementiert in XSLT 2.0: temporary trees 8

dictionaries übersetze cctlds in Ländernamen: <xsl:variable name="ccdict"> <cc suffix="de">germany</cc> <cc suffix="uk">united Kingdom</cc> <cc suffix="fr">france</cc> </xsl:variable> <xsl:template match="domain"> <xsl:variable name="tld" select="substring(.,string-length(.)-1)"/> <xsl:value-of select="."/> is in <xsl:value-of select="exslt:node-set($ccdict)/cc[@suffix=$tld]"/> </xsl:template> 9

Aufgaben Die Datei cd-collection2.xml enthält eine weitere CD-Sammlung. Das CD-Element wurde um ein Attribut genre mit den folgenden Belegungen ergänzt: jz fs st rb Jazz Fusion Sound Track Rythm&Blues Überzeuge Dich davon, daß sich diese Datei immer noch mit dem Stylesheet der letzten Stunde transformieren läßt. Erweitere das bisherige Stylesheet zur Formatierung so, daß der ausgeschriebene Name des Genres angezeigt wird. Definiere ein dictionary: <xsl:variable name="genre"> <genre abbrv="rb">rythm&blues</genre> <genre abbrv="jz">jazz</genre> <genre abbrv="fs">fusion</genre> <genre abbrv="st">sound Track</genre> </xsl:variable> Extrahiere den passenden Genre-Namen aus dem dictionary: <xsl:variable name="thisgenre" select="@genre"/> <i> <xsl:value-of select="exslt:node-set($genre)/genre[@abbrv=$thisgenre]"/> </i> Das aktuelle Genre muß in einer Variablen abgespeichert werden. Im Prädikat kann man nicht [@abbrv=@genre] schreiben, da dann nicht klar ist, daß sich @genre auf ein Attribut unterhalb des aktuellen Kontext-Knotens bezieht, und nicht auf den XPath-Ausdruck. 10

mehrstufige Verarbeitung Zwischenergebnis in Variable ablegen und weiterverarbeiten ermöglicht komplexe Transformationen: Sortierkriterien, die nicht mit XPath berechnet werden können Gruppierungen Filterung... 11

mehrstufige Verarbeitung, cont. Aufgabe: Wer ist wie häufig Deutscher Meister geworden? <soccerchamps> <champ year="2004">sv Werder Bremen</champ> <champ year="2003">fc Bayern München</champ> <champ year="2002">bv 09 Borussia Dortmund</champ>... </soccerchamps> Ansatz: Zählergebnis in result tree fragment speichern: <team number="4">sv Werder Bremen</team> <team number="17">fc Bayern München</team> <team number="3">bv 09 Borussia Dortmund</team>... mit xsl:for-each und xsl:sort leicht zu verarbeiten 12

mehrstufige Verarbeitung, cont. <xsl:template match="/soccerchamps"> <xsl:variable name="countlist"> <xsl:call-template name="countchamps"/> </xsl:variable> <xsl:for-each select="exslt:node-set($countlist)/team"> <xsl:sort select="@number" data-type="number" order="descending"/> <tr> <td><xsl:value-of select="."/></td> <td><xsl:value-of select="@number"/> championships</td> </tr> </xsl:for-each> </xsl:template> 13

mehrstufige Verarbeitung, cont. <xsl:template name="countchamps"> <xsl:for-each select="/soccerchamps/champ[not(.=preceding::champ)]"> <xsl:variable name="team" select="."/> <team> <xsl:attribute name="number"> <xsl:value-of select="count(/soccerchamps/champ[.=$team])"/> </xsl:attribute> <xsl:value-of select="$team"/> </team> </xsl:for-each> </xsl:template> Der XPath-Ausdruck in der for-each-schleife muß die gezeigt Form haben. Folgender Ausdruck funktioniert nicht: /soccerchamps/champ[.!=preceding::champ] Wenn node sets verglichen werden, sind $x!=3 und not($x=3) nicht identisch. Der Vergleich $x=3 ist dann wahr, wenn wenigstens ein Knoten in $x zu 3 evaluiert. Dementsprechend ist der Ausdruck not(..=..) wahr, wenn kein Knoten den Wert 3 hat. Der erste Ausdruck (..!=..) ist wahr, wenn wenigstens ein Knoten ungleich 3 ist. Ein node set kann also gleichzeitig gleich (=) und ungleich (!=) zu einem bestimmten Wert sein. 14

Aufgaben Verwende das Stylesheet aus der letzten Stunde oder procorder.xsl aus dem Übungs-Archiv. Ändere das Stylesheet so ab, daß die einzelnen Posten nach ihrem jeweiligen Gesamtwert sortiert ausgegeben werden: <td>narcotics</td><td>114.8</td><td>12</td><td>1377.6</td> <td>luxuries</td><td>91.2</td><td>7</td><td>638.4</td> <td>food</td><td>4.4</td><td>10</td><td>44</td> <td>textiles</td><td>6.4</td><td>5</td><td>32</td> Erzeuge durch das named template total folgende XML-Ausgabe: <line> <name>food</name><price>4.4</price><quant>10</quant><sum>44</sum> </line>... <total>2092</total> Speichere sie als result tree fragment in einer Variable. Iteriere über die sortierten line-elemente: <xsl:for-each select="exslt:node-set($result)/line"> <xsl:sort select="sum" data-type="number" order="descending"/> <tr> <td><xsl:value-of select="name"/></td> <td><xsl:value-of select="price"/></td> <td><xsl:value-of select="quant"/></td> <td><xsl:value-of select="sum"/></td> </tr> </xsl:for-each> Gib die Gesamtsumme aus: <tr> <td><b>total</b></td><td> </td><td> </td> <td><xsl:value-of select="exslt:node-set($result)/total"/></td> </tr> 15

modes Elemente mehrfach verarbeiten dabei unterschiedliche Formatierung Überschrift und Inhaltsverzeichnis: <xsl:template match="heading" mode="chapter"> <h2><a name="..."><xsl:apply-templates/></a></h2> </xsl:template> <xsl:template match="heading" mode="toc"> <tr><td><a href="..."><xsl:apply-templates/></a><td></tr> </xsl:template> Aufruf: <xsl:apply-templates select="heading" mode="chapter"/> 16

Beispiel: procorder.xsl item-elemente aus Liste übernehmen und Summe hinzufügen zwei templates für item: Summe berechnen HTML-Ausgabe erzeugen Vorteile: Code zum Formatieren kann übernommen werden bessere Modularisierung des Stylesheets bessere Erweiterbarkeit 17

procorder.xsl <table width="100%"> <xsl:copy-of select="$tablehead"/> <xsl:variable name="proclist"> <xsl:call-template name="summarize"> <xsl:with-param name="items" select="item"/> </xsl:call-template> </xsl:variable> <xsl:apply-templates select="exslt:node-set($proclist)/item" mode="table"> <xsl:sort select="sum" data-type="number" order="descending"/> </xsl:apply-templates> <xsl:call-template name="listtotal"> <xsl:with-param name="total"> <xsl:value-of select="exslt:node-set($proclist)/total"/> </xsl:with-param> </xsl:call-template> </table> Die Variable tablehead enthält statischen HTML-Code, um die Kopfzeile der Tabelle zu erzeugen. 18

procorder.xsl, cont. <xsl:template name="summarize"> <xsl:param name="items"/> <xsl:param name="sum" select="0"/> <xsl:choose> <xsl:when test="$items"> <xsl:apply-templates select="$items[1]" mode="sum"/> <xsl:call-template name="summarize"> <xsl:with-param name="items" select="$items[position()!=1]"/> <xsl:with-param name="sum" select="$sum + $items[1]/price * $items[1]/quant"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <total><xsl:value-of select="$sum"/></total> </xsl:otherwise> </xsl:choose> </xsl:template> 19

procorder.xsl, cont. <xsl:template match="item" mode="sum"> <item> <xsl:copy-of select="* @*"/> <sum><xsl:value-of select="price * quant"/></sum> </item> </xsl:template> <xsl:template match="item" mode="table"> <tr> <xsl:for-each select="*"> <td><xsl:value-of select="."/></td> </xsl:for-each> </tr> </xsl:template> In der sum-variante werden mit Hilfe von xsl:copy-of alle Kind-Elemente und Attribute des item-elements in das result tree fragment kopiert. Sie stehen somit einer späteren Verarbeitung, z.b. in der table-variante, zur Verfügung. Ein (kleiner) Nachteil dieses Stylesheets ist, daß das Produkt aus price und quant zweimal berechnet wird. 20

mehrere Quell-Dokumente Eingabe-Datei wird in Ausgabe-Datei transformiert weitere Dateien können gelesen werden... select="document( literature.xml )/book"... liefert node-set, das beliebig weiterverarbeitet werden kann Anwendungen: dictionaries auslagern statische HTML-Teile (Kopf-/Fußzeile) Web-Site: Stylesheet transformiert Seiten-Layout Inhalt wird per document() dazugelesen 21

Aufgaben Die Datei tradegoods.xml enthält eine Liste von Handelswaren und Preisen. order2.xml enthält eine Warenliste, die das price-element nicht mehr enthält. Ändere das Stylesheets so ab, daß die Preis-Informationen aus der externen XML-Datei gelesen werden. Der Handel einiger Waren ist illegal, dies ist in der Preisliste durch das status-attribut gekennzeichnet. Hebe in der HTML-Ausgabe alle illegalen Posten farblich hervor: <tr bgcolor="red"> Preise aus externer Datei lesen: <xsl:variable name="pricelist" select="document( tradegoods.xml )/goods"/> <xsl:variable name="price" select="$pricelist/item[name=$items[1]/name]/price"/> <xsl:apply-templates select="$items[1]" mode="sum"/> <xsl:call-template name="summarize"> <xsl:with-param name="items" select="$items[position()!=1]"/> <xsl:with-param name="sum" select="$sum + $price * $items[1]/quant"/> </xsl:call-template> <xsl:variable name="name" select="name"/> <xsl:variable name="price" select="$pricelist/item[name=$name]/price"/>... <price><xsl:value-of select="$price"/></price> <sum><xsl:value-of select="$price * quant"/></sum> Kennzeichne illegale Waren: <xsl:variable name="name" select="name"/> <tr> <xsl:if test="$pricelist/item[name=$name]/@status= illegal "> <xsl:attribute name="bgcolor">red</xsl:attribute> </xsl:if> 22