430 likes | 646 Views
Zum Einstieg, zur Wiederholung und zur Vertiefung: Datengewinnung Datenanreicherung Datenverarbeitung …mit XML und XSLT. Der Plan. Wo das XML herkommt Wie das XML schöner wird Regex XSLT Was hinten rauskommt document() Variablen xsl:for-each-group Visualisierung. … wo das XML herkommt.
E N D
Zum Einstieg,zur Wiederholungund zur Vertiefung:DatengewinnungDatenanreicherungDatenverarbeitung…mit XML und XSLT
Der Plan • Wo das XML herkommt • Wie das XML schöner wird • Regex • XSLT • Was hinten rauskommt • document() • Variablen • xsl:for-each-group • Visualisierung
… wo das XML herkommt • XML aus Word • Word ist schon XML • Übersetzung Typographie in Markup • Übergabe an OpenOffice • XML aus OpenOffice • TEI OpenOffice Package
… wo das XML herkommt • XML aus Word • Word ist schon XML • Übersetzung Typographie in Markup • Übergabe an OpenOffice • XML aus OpenOffice • TEI OpenOffice Package • Pro und Kontra • XML aus XML-Editoren • Author Mode
… wo das XML herkommt • XML aus Word • Word ist schon XML • Übersetzung Typographie in Markup • Übergabe an OpenOffice • XML aus OpenOffice • TEI OpenOffice Package • Pro und Kontra • XML aus XML-Editoren • Author Mode • Die Welt der spitzen Klammern
XML-Daten verbessern • Ziel: Handarbeit vermeiden! • Einfaches Suchen&Ersetzen • Word-(OpenOffice)-Macros • Regular Expressions • regex in XSLT • Datenanreicherung mit XSLT
Regular Expressions (in Oxygen) • Ausgangslage • Verschiedene Dialekte • Maßgeblich: perlre • Umfang der Implementierung? • oXygen vs. XML-Schema vs. XSLT • Syntax
Regular Expressions (in Oxygen) • Syntax (nur das allerwichtigste) . Beliebiges Zeichen [] Zeichenklasse [0-9], [a-z] beliebige Ziffer bzw. Buchstabe () Gruppierung … kann später angesprochen werden | oder [r | v] der Buchstabe r oder v \ Maskierung \. tatsächlich ein Punkt und nicht beliebieges Zeichen * Beliebige Häufigkeit .* beliebige Menge beliebiger Zeichen + Ein oder mehrmals [0-9]+ eine Zahl mit mindestens einer Stelle ? Ein oder kein Mal [0-9]? eine Ziffer oder nichts
Regular Expressions (in Oxygen) • Syntax (schon nicht mehr so wichtig) \d Ziffer \w Buchstabe oder Ziffer \s Whitespace-Zeichen ^ Anfang einer neuen Zeile $ Zeilenende \n Zeilenumbruch ? Greediness ausschalten ([0-9].*\])*? [in Oxygen10 nicht implementiert] • … und weitere, siehe z.B. http://perldoc.perl.org/perlre.html
Regular Expressions (in Oxygen) • Ausgangslage (perlre) • Syntax • Das wichtigste: Gruppierte Muster bilden Variablen auf die man beim Ersetzen zugreifen kann • Obacht: Zeilenorientierung, greediness • Beispiel 1 (einfache Seitenumbrüche) • Beispiel 2 (Ilg-Apparat)
Regular Expressions (in Oxygen) • Beispiel 1 text [1ra] text [1rb] text [1va] text [1vb] text [2ra] text [2rb] text [2va] • Beispiel 2 <app n="1"></app><app n="X_*">Versus C. R., et ed. R. absunt ab omnibus… <app n="2"></app><app n="X_1">animaeque, V.</app><app n="X_2">vacationem… <app n="3"></app><app n="X_1">hylariV,.</app><app n="X_2">evangelici C. …
Regular Expressions (in Oxygen) • Ausgangslage (perlre) • Syntax • Das wichtigste: Gruppierte Muster bilden Variablen auf die man beim Ersetzen zugreifen kann • Obacht: Zeilenorientierung, greediness • Beispiel 1 (einfache Seitenumbrüche) • Beispiel 2 (Ilg-Apparat) • Erweiterung: regex plus XPath • Möglichkeiten und Grenzen
regex in XSLT • xsl:analyze-string • xsl:matching-substring, xsl:non-matching-substring • XPath-Funktionen • matches() • replace() • tokenize()
Datenanreicherung per XSLT: copy-all-but … • Ausgangslage • Grundtemplate
Datenanreicherung per XSLT: copy-all-but … • Grundtemplate <xsl:template match="node() | @* | processing-instruction() | comment()"><xsl:copy> <xsl:apply-templates select="node() | @* | processing-instruction() | comment()"/></xsl:copy> </xsl:template> - Was ist der Trick dahinter?
Datenanreicherung per XSLT: copy-all-but … • Ausgangslage • Grundtemplate • Beispiel 1 (falsche Seitenumbrüche, copy-all-Beispiel1.xml) • … mit copy-all.xsl • Beispiel 2 (mehrfache Apparate) • Lösung: multiple_apps.xl
Datenanreicherung per XSLT: die document()-Funktion • Anwendungsszenarien • Die document()-Funktion ( … und doc-available() ) • Mögliche Fehlerquellen (String vs. Pfad; Namensräume) • Beispiel1 (Images hinzuziehen, regex-Beispiel1, images.xml, copy-all.xsl) • Beispiel2 (Geokoordinaten, locations.xml) • Zum Verständnis: http://maps.google.com/maps/geo?q=Berlin&output=xml&sensor=false&key=ABQIAAAA6wyLPpbDp03tNqBX6NzZyRT2yXp_ZAY8_ufC3CFXhHIE1NvwkxRNs-JV0rqHP75bygTkcn_guLR8zg • … was mit einem Google-Service geht, geht mit jeder wohlgeformten XHTML-Seite! (Beispiel geo-coord aus wp; Schriftsteller aus wp)
Auch ein Single Source Prinzip: die result-document()-Funktion • Anwendungsszenarien (siehe z.B. sdoe) • <xsl:result-document href="Pfad/Dateiname"> • … viele weitere Schalter … • Die Mächtigkeit von result-document <xsl:for-each select="div"> <xsl:result-document href="html/teil-{@n}.html"> … alle weiteren Anweisungen </xsl:result-document> </xsl:for-each>
Schwach, stark, nützlich: Variablen • Variablen in XML können nichts • keine Veränderung • nur lokal gültig (Übergabe als Parameter) • Variablen in XML können vieles • Ständige Überschreibung in Schleifen • Komplexe Inhalte durch Aufruf weiterer Templates • Variablen in XML sind anders • Variablen können Kontextinformationen speichern • Variablen können temporäre Knotenbäume enthalten … Variablen können beliebige Bäume enthalten
Wie ging es eigentlich jemals ohne? xsl:for-each-group • Einsatzzwecke • Der xsl:for-each-group-Befehl • @select, @group-by • (@group-adjacent, @group-ending-with, @group-starting-with) • current-group(), current-grouping-key() • Beispiel1 (Fischer-Frage) • Refs rausziehen; mit copy-all-but + document zurückspielen • Beispiel2 (Schriftsteller (herleiten!), Geburtskohorten) • geb-kohorten.xsl schreiben
Visualisierung? • Visualisierung wozu? • http://benfry.com/traces/ • Fake-Grafiken (?) mit HTML • Beispiel (Geburtskohorten) • Eigene Grafiken mit SVG • Torten und anderes Eye Candy • Beispiel (Verteilung der Hss. auf Sprachen) • Google-Maps • Beispiel (Handschriftenlokalisierung)
XSLT- produziert
Visualisierung? • Visualisierung wozu? • Fake-Grafiken (?) mit HTML • Beispiel (Geburtskohorten) • Eigene Grafiken mit SVG • Torten und anderes Eye Candy
Visualisierung? • Visualisierung wozu? • Fake-Grafiken (?) mit HTML • Beispiel (Geburtskohorten) • Eigene Grafiken mit SVG • Torten und anderes Eye Candy • Beispiel (Verteilung der Hss. auf Sprachen)
Simple Pie Chart … <img src= "http://chart.apis.google.com/chart?chs=450x125 &cht=p &chd=t:{$ProzArab},{$ProzHeb},{$ProzLat} &chl=arabic|hebrew|latin &chdl={$ProzArab}%|{$ProzHeb}%|{$ProzLat}% " />
"Google-o-Meter" <img src="http://chart.apis.google.com/chart?chs=225x125 &cht=gom &chd=t:{$VollstaendigkeitFol} &chl=Seitenangaben({$VollstaendigkeitFol}%) "/>
Visualisierung? • Visualisierung wozu? • Fake-Grafiken (?) mit HTML • Beispiel (Geburtskohorten) • Eigene Grafiken mit SVG • Torten und anderes Eye Candy • Beispiel (Verteilung der Hss. auf Sprachen) • Google-Maps • Beispiel (Handschriftenlokalisierung)
Google Maps per XSLT • Drei Zutaten • HTML-Container • Externe Javascripte • Lokale Einstellungen (Javascript) • Key • Karte: Mittelpunkt, Zoomfaktor, Funktionalitäten • Marker: Position, Info-Fenster (HTML)
Drei Zutaten … • <script src="http://maps.google.com/maps?file=api&v=2&sensor=false&key=ABQIAAAA6wyLPpbDp03tNqBX6NzZyRT2yXp_ZAY8_ufC3CFXhHIE1NvwkxRNs-JV0rqHP75bygTkcn_guLR8zg" type="text/javascript"></script> • <div id="map" style="width: 950px; height: 350px"></div>
Drei Zutaten … • <script type="text/javascript"> //<![CDATA[ if (GBrowserIsCompatible()) { function createMarker(point,html) { var marker = new GMarker(point); GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(html); }); return marker; } // Display the map, with some controls and set the initial location var map = new GMap2(document.getElementById("map")); map.addControl(new GLargeMapControl()); map.addControl(new GMapTypeControl()); map.setCenter(new GLatLng(48,-7),3);…
Drei Zutaten … • // Set up markers with info windows <xsl:for-each-group select="//location" group-by="."> <xsl:variable name="longlat" select="document('locations_geo.xml')// locations[.=current-grouping-key()]/@longlat"></xsl:variable> <xsl:variable name="breite" select="substring-before($longlat,' ')"/> <xsl:variable name="laenge" select="substring-after($longlat,' ')"/> <xsl:variable name="infotext" select="'//institution'"></xsl:variable> var point = new GLatLng(<xsl:value-of select="$breite"/>, <xsl:value-of select="$laenge"/>); var marker = createMarker(point,'<a href="#{current-group()[1]/../text()}"> <xsl:value-of select="current-grouping-key()"/></a>:<br/> <xsl:for-each-group select="current-group()" group-by="../../institution"> <xsl:value-of select="current-grouping-key()"/> <br/> </xsl:for-each-group>'); map.addOverlay(marker);</xsl:for-each-group> } //]]> </script>
… jetzt noch einmal grundsätzlich: zwei Basisstrategien in XSLT • "pull-Ansatz" • ein template erledigt so viel wie möglich, indem es nacheinander Teilaufgaben abarbeitet und sich dazu die benötigten Inhalte selbst holt • zunächst übersichtlich, einfach zu entwickeln, unabhängig von der Reihenfolge der Elemente im xml, nicht modular, wird bei komplexen Dokumenten unübersichtlich • "push-Ansatz" • templates betreffen möglichst immer nur bestimmte Elemente und verweisen für deren Inhalte auf andere templates (xsl:apply-templates) • für Anfänger unübersichtlicher, abhängig von der Reihenfolge der Elemente im xml, modularsierte templates werden in verschiedenen Kontexten verwendet, bei komplexen Dokumenten letztlich leichter wartbar • in der Praxis häufig Mischung beider Strategien
Basisstrategien in XSLT … <!-- Pull --> <xsl:template match="/"> <xsl:for-each select="div"> <h1><xsl:value-of select="head"/></h1> <xsl:for-each select="p"> <p><xsl:value-of select="."></xsl:value-of></p> </xsl:for-each> </xsl:for-each> </xsl:template> • Es gibt Situationen, die sich mit einem pull-Ansatz nicht lösen lassen! <p> enthalte <persName> …
Basisstrategien in XSLT … <!-- Push --><xsl:template match="/"> <xsl:apply-templates/></xsl:template><xsl:template match="div"> <xsl:apply-templates/></xsl:template><xsl:template match="head"> <h1><xsl:value-of select="."/></h1></xsl:template><xsl:template match="p"> <p><xsl:value-of select="."/></p></xsl:template>
Basisstrategien in XSLT … <!-- Pull und Push --> <xsl:template match="/"> <h1>Inhalte</h1> <ul> <xsl:for-each select="div"> <li><a href="#@n"><xsl:value-of select="head"/></a></li> </xsl:for-each> </ul> <xsl:apply-templates/> <xsl:template match="div"> <a name="@n"/> <xsl:apply-templates/> </xsl:template> <xsl:template match="head"> <h1><xsl:value-of select="."/></h1> </xsl:template> <xsl:template match="p"> <p><xsl:value-of select="."/></p> </xsl:template> </xsl:template>
Templates können sich auch wie Funktionen verhalten <!– am Anfang muss der namespace kml deklariert sein --> <xsl:call-template name="fetchGeo"> <xsl:with-param name="suche" select="Berlin"/> </xsl:call-template> <xsl:template name="fetchGeo"><xsl:param name="suche"/><xsl:variable name="key" select="'ABQIAAAA6wyLPpbDp03tNqBX6NzZyRT2yXp_ZAY8_ufC3CFXhHIE1NvwkxRNs-JV0rqHP75bygTkcn_guLR8zg'"/><xsl:variable name="URL" select="http://maps.google.com/maps/geo? q={$suche}&output=xml&sensor=false&key={$key}"/><xsl:value-of select="document($URL)//kml:coordinates"/> </xsl:template>