1 / 43

Der Plan

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.

lena
Download Presentation

Der Plan

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Zum Einstieg,zur Wiederholungund zur Vertiefung:DatengewinnungDatenanreicherungDatenverarbeitung…mit XML und XSLT

  2. Der Plan • Wo das XML herkommt • Wie das XML schöner wird • Regex • XSLT • Was hinten rauskommt • document() • Variablen • xsl:for-each-group • Visualisierung

  3. … wo das XML herkommt • XML aus Word • Word ist schon XML • Übersetzung Typographie in Markup • Übergabe an OpenOffice • XML aus OpenOffice • TEI OpenOffice Package

  4. … 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

  5. … 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

  6. XML-Daten verbessern • Ziel: Handarbeit vermeiden! • Einfaches Suchen&Ersetzen • Word-(OpenOffice)-Macros • Regular Expressions • regex in XSLT • Datenanreicherung mit XSLT

  7. Regular Expressions (in Oxygen) • Ausgangslage • Verschiedene Dialekte • Maßgeblich: perlre • Umfang der Implementierung? • oXygen vs. XML-Schema vs. XSLT • Syntax

  8. 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

  9. 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

  10. 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)

  11. 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. …

  12. 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

  13. regex in XSLT • xsl:analyze-string • xsl:matching-substring, xsl:non-matching-substring • XPath-Funktionen • matches() • replace() • tokenize()

  14. Datenanreicherung per XSLT: copy-all-but … • Ausgangslage • Grundtemplate

  15. 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?

  16. 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

  17. 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)

  18. 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>

  19. 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

  20. 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

  21. 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)

  22. XSLT- produziert

  23. Visualisierung? • Visualisierung wozu? • Fake-Grafiken (?) mit HTML • Beispiel (Geburtskohorten) • Eigene Grafiken mit SVG • Torten und anderes Eye Candy

  24. http://code.google.com/intl/de-DE/apis/charttools/

  25. Visualisierung? • Visualisierung wozu? • Fake-Grafiken (?) mit HTML • Beispiel (Geburtskohorten) • Eigene Grafiken mit SVG • Torten und anderes Eye Candy • Beispiel (Verteilung der Hss. auf Sprachen)

  26. Simple Pie Chart … <img src= "http://chart.apis.google.com/chart?chs=450x125 &amp;cht=p &amp;chd=t:{$ProzArab},{$ProzHeb},{$ProzLat} &amp;chl=arabic|hebrew|latin &amp;chdl={$ProzArab}%|{$ProzHeb}%|{$ProzLat}% " />

  27. "Google-o-Meter" <img src="http://chart.apis.google.com/chart?chs=225x125 &amp;cht=gom &amp;chd=t:{$VollstaendigkeitFol} &amp;chl=Seitenangaben({$VollstaendigkeitFol}%) "/>

  28. 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)

  29. Google Maps per XSLT

  30. Google Maps per XSLT • Drei Zutaten • HTML-Container • Externe Javascripte • Lokale Einstellungen (Javascript) • Key • Karte: Mittelpunkt, Zoomfaktor, Funktionalitäten • Marker: Position, Info-Fenster (HTML)

  31. Drei Zutaten … • <script src="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=false&amp;key=ABQIAAAA6wyLPpbDp03tNqBX6NzZyRT2yXp_ZAY8_ufC3CFXhHIE1NvwkxRNs-JV0rqHP75bygTkcn_guLR8zg" type="text/javascript"></script> • <div id="map" style="width: 950px; height: 350px"></div>

  32. Drei Zutaten … • <script type="text/javascript"> //&lt;![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);…

  33. 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> } //]]&gt; </script>

  34. … 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

  35. 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> …

  36. 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>

  37. 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>

  38. 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}&amp;output=xml&amp;sensor=false&amp;key={$key}"/><xsl:value-of select="document($URL)//kml:coordinates"/> </xsl:template>

More Related