|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ISBN: 3423050012 ISBN: 3423050012 ISBN: 3423050012 ISBN: 3423050012 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
Wir empfehlen: | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Einführung in XSL-Transformation (XSLT)EinleitungDie vorliegende Seite ist in HTML geschrieben. Ein HTML-Browser kann sie ohne weiteres darstellen. Ein Dokument in XML ist zwar in manchen Browsern darstellbar, besitzt aber naturgemäß keine Formatierung, die das Lesen unterstützt. Das liegt daran, daß XML frei definierbare Tags verwendet, die ein Browser nicht ohne weiteres interpretieren kann, so daß bestenfalls die Textinhalte dargestellt werden können, oder wie ab MS-Internet Explorer 5 die Struktur des XML-Dokuments.Beispiel
bd311.xml Einführende Analyse des XSLT-Style Sheets<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> Ein XSLT Style Sheet ist formal eine wohlgeformte XML-Datei mit der Deklaration eines Namensraums (xmlns, mit dem Kürzel "xsl"), der auf "http://www.w3.org/1999/XSL/Transform" verweist. Das Kürzel "xsl" ist im Grunde beliebig, wird aber meistens so verwendet. In der Style Sheet Datei bedeuten alle XML-Elemente, die zu diesem Namensraum gehören, daß diese Elemente als Befehle interpretiert werden, die der sogenannte XSLT-Prozessor (das Programm mittels dieses Style Sheets eine gegebene XML-Quelldatei umwandelt) verarbeitet. Alle anderen Tags (in diesem Fall die bekannten HTML-Tags) werden im Verarbeitungsablauf unverändert an die Ausgabe weitergeleitet. <xsl:output method="html"/> Hier wird die Ausgabemethode festgelegt. Die Ausgabemethode bestimmt im wesentlichen die Art und Weise, wie Zeichen geschrieben werden, bei "html" wird also zum Beispiel aus den Umlauten (ÄÖÜ) ÄÖÜ . <xsl:template match='/'> <html> <head> <title> <xsl:value-of select="/abschnitt/ueberschrift/text()"/> </title> </head> <body> <xsl:apply-templates select="*"/> </body> </html> </xsl:template> Templates sind an oberster Stelle unter dem Stylesheet-Element angesiedelt. Sie bestimmen anhand des match-Attributs, auf welche Bestandteile des XML-Dokuments die in das Element eingeschlossenen Unterbestandteile angewendet werden sollen. Für das Verständnis der Verarbeitung ist es wichtig, sich das XML-Quelldokument als "Baum" (bd311.png) vorzustellen, mit dem Dokument-Element als Stamm-Wurzel und den Unterelementen und deren Unterelementen bzw. Textinhalten als Verzweigungen des Wurzelwerkes. In obigem Template kann man sich das so vorstellen:
Die Anweisung apply-templates bewirkt, daß alle Informationen die auf den XPath Ausdruck "*" passen, durchgemustert werden, ob auf sie wiederum ein Template paßt. "*" ist der Name für ein beliebiges Element, welches direkt unterhalb des aktuellen Elements (in diesem Fall "/") liegt. Im konkreten Fall (bd311.xml) wird abschnitt gefunden (Dokument-Element). <xsl:template match="abschnitt"> <xsl:apply-templates select="*"/> </xsl:template> Auf jeden Elementknoten abschnitt wird lediglich die Anweisung ausgeführt, daß wiederum direkte Unterelemente herausgesucht werden. In diesem Fall ueberschrift, p und abschnitt. <xsl:template match="ueberschrift"> <h1> <xsl:apply-templates select="*|text()"/> </h1> </xsl:template> Ein Elementknoten ueberschrift wird mit HTML-h1 getaggt. Zwischen Start- und Ende-Tag werden direkte Unterelemente und Textknoten herausgesucht. <xsl:template match="text()"> <xsl:value-of select="."/> </xsl:template> Textknoten werden mit der value-of-Anweisung direkt dargestellt.. <xsl:template match="/abschnitt/abschnitt[@FileID='BD311w.xml']"> <table> <xsl:apply-templates select="wert"> <xsl:sort select="code"/> </xsl:apply-templates> </table> </xsl:template> Dieses Template paßt nur auf Abschnitte, die unter einem Abschnitt liegen, der unter dem Wurzelknoten liegt und das Attribut FileID mit dem Wert BD311w.xml besitzen. In diesem Fall werden die Unterelemente wert und zwar sortiert nach deren Unterelement code herausgesucht. Außerdem wird alles, was bei apply-templates gefunden wird, in eine HTML-Tabelle gepackt. <xsl:template match="wert"> <tr> <td> <xsl:apply-templates select="code/*|code/text()"/> </td> <td>=</td> <td> <xsl:apply-templates select="beschreibung/*|beschreibung/text()"/> </td> </tr> </xsl:template> Dieses Template erstellt für die gefundenen Werte die eigentliche Tabellenreihen. In der ersten Spalte werden Unterelemente des Unterelements Code und Textknoten des Unterelements Code herausgesucht. In der zweiten Spalte passiert das gleiche für die Beschreibungen. <xsl:template match="p|b"> <xsl:copy> <xsl:apply-templates select="*|text()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> Elemente, mit dem Namen p oder b werden einfach in die Ausgabe kopiert und dann werden alle Unterelemente und Textknoten herausgesucht.
XPathDas einleitende Beispiel hat bereits deutlich gemacht, daß die sogenannten XPath-Ausdrücke eine zentrale Rolle zum Verständnis von XSLT spielen. Dieses Kapitel befaßt sich daher mit diesem Aspekt. XPath wird außer für XSLT auch noch für die XPointer-Technik verwendet, mit der auf Ausschnitte von XML-Dokumenten verwiesen werden kann.Für das Verständnis von XPath sind zunächst drei Grundbegriffe notwendig:
AchsenAchsen sind unabhängig vom Knotentyp die Richtung, in der der Baum durchlaufen wird. Achsen werden über ihre Bezeichnung, gefolgt von "::" angesprochen. Es gibt folgende Achsen (mit beispielhafter Angabe von gefundenen Knoten):
KnotenDas sogenannte Datenmodell von XPath kennt sieben Knotentypen, die sich natürlich aus den Strukturen, die in einem XML-Dokument vorkommen können, ableiten, aber zum Teil einige Besonderheiten haben. Wurzelknoten und Elementknoten können Kinder (Knoten unterschiedlicher Typen) besitzen. Daher muß es eine Testmöglichkeit geben, um den Typ eines Knotens festzustellen
Mit den Konstrukten Knoten und Achsen können bereits erste XPath
Ausdrücke ausprobiert werden. Prädikate sind nicht unbedingt
notwendig und werden zur Übersichtlichkeit erst später erläutert.
Für häufig verwendete Achsen/Knoten gibt es Abkürzungen,
die die Pfadangaben denen eines UNIX-Dateisystems ähneln lassen.
Beispiele
ÜbungFür die Evaluation von XPath-Ausdrücken wird ein Werkzeug, "xmltest" bereitgestellt, in dem die Namen von XML-Dateien sowie Pfadausdrücke eingegeben werden können und diese anschließend ausgewertet werden können.
PrädikateMit den optionalen Prädikaten kann man die Ergebnismenge gefundener Knoten weiter einschränken. Prädikate können in allen Location Steps angewendet werden und werden an Achse/Knoten angehängt, so daß ein vollständiger Ausdruck für einen Location Step folgendermaßen aussieht:Achse::Knoten[Prädikate]Ein Prädikat besteht aus einer oder mehrerer verknüpfter Bedingungen, die auf die zunächst erhaltene Ergebnismenge angewendet werden. Wenn die Bedingungen den Wahrheitswert "WAHR" zurückgeben, wird das Element der Ergebnismenge ausgewählt. XPath stellt dafür eine Reihe von Funktionen bereit, von denen im folgenden nur einige beispielhaft gezeigt werden. BeispieleXML-Quelldatei, wenn nicht anders angegeben, bd311.xml
ÜbungIn bd5.xml heraussuchen:
XSLT in Beispielen und ÜbungenDas einfachste XSLT Style Sheet minimal.xsl sieht folgendermaßen aus:Auf die Datei bd311.xml angewandt liefert es folgende Ausgabe:<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> </xsl:stylesheet> Anlaß der Erfassung von DiagnosedatenHier soll erfaßt werden, in welcher Phase der Betreuung bzw. mit welchem Ziel der Patient im Zentrum aufgenommen worden ist. Bei jeder Behandlung und Betreuung werden in gewissem Umfang diagnostische Maßnahmen durchgeführt. Diagnostische Maßnahmen sind deshalb bei den Kürzeln "E" und "W" enthalten. Die Merkmalsausprägung "D" (Diagnostik) bedeutet, daß innerhalb des Zentrums nur die Diagnostik durchgeführt wurde und der Patient zur Weiterbehandlung in eine andere Klinik verlegt worden ist.EErstbehandlungWWeiterbehandlungLNachsorge / LangzeitbetreuungDNur DiagnostikXUnbekanntAnmerkung: Diese Ausgabe ist bereits verschönert und sieht eigentlich folgendermaßen aus: minimal.txt. Mit einem kleiner zusätzlichen Anweisung (<xsl:output method='text' encoding="iso-8859-1"/>) wurde als Ausgabeformat das Textformat mit dem Zeichensatz "iso-8859-1" gewählt. Offensichtlich wurden einfach alle Textknoten des Dokuments in der richtigen Reihenfolge ausgegeben. Das liegt daran, daß in jedem Stylesheet einige Templates und dazugehörige Verarbeitungsregeln als vorhanden angenommen werden. Built-in Template Rules<xsl:template match="*|/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="text()|@*"> <xsl:value-of select="."/> </xsl:template> <xsl:template match="processing-instruction()|comment()"/>
<xsl:template match="*|/" mode="m"> <xsl:apply-templates mode="m"/> </xsl:template>Sie entspricht der obigen ersten Regel weitgehend und tritt dann in Kraft, wenn mit Modi gearbeitet wird. Modi dienen dazu, gleiche Knotenmengen für unterschiedliche Zwecke mehrfach zu bearbeiten, z.B. Überschriften einmal für das Inhaltsverzeichnis und einmal für den Volltext. Es ist wichtig, diese eingebauten Regeln zu verstehen. Zum einen ersparen sie für häufige Fälle Tiparbeit (in der Regel möchte man ja Textknoten in der ausgabe haben, da diese die Information tragen), zum anderen können sie gelegentlich auch unerwünschte Nebeneffekte verursachen. In diesem Fall sollte man sie mit einer eigenen Regel "überschreiben". Die selbst definierten Regeln haben immer eine höhere Priorität. Erste XSLT Style SheetsMit dem Wissen, daß
Hinweise: Ähnlich deshalb, weil nur die Kind und Attributachse sowie "//" und die id() und key() Funktion benutzt werden dürfen. Außerdem können einzelne Ausdrücke mit "|" kombiniert werden, was eine Vereinigungsmenge bewirkt. ÜbungenFür die Übungen können Sie wieder den bereits bekannten XML-Tester verwenden.Als Beispiel XML-Dateien dienen die bekannten bd5.xml
und bd311.xml. Die Style Sheet Dateien erstellen
Sie selbst, indem Sie im gleichen Verzeichnis neue Dateien, am besten mit
der Endung "xsl" erzeugen (z.B. über kopieren und umbenennen) und
mit dem Notepad bearbeiten.
Hinweis: Wohlgeformtes XML wird nicht automatisch dadurch erzeugt, das Quelldokument und Style Sheet XML sind. Erzeugen von XML-Markup und TextEs wurde bereits gezeigt, daß XML-Elemente in der Ausgabe einfach dadurch erzeugt werden können, daß in den Templates entsprechendes Markup und Text hineingeschrieben werden. Häufig müssen jedoch Namen von Elementen oder Attributen dynamisch erzeugt werden können. Für diesen Fall stellt XSLT für alle Knotentypen Anweisungen bereit, um sie zu erzeugen. Das nachfolgende Beispiel zeigt (kopieren.xsl), wie diese Anweisungen einfach ein Eingabedokument in ein identisches Ausgabedokument umformen.<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method='xml'/>
<xsl:template match='/'>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match='*'>
<xsl:element name="{name()}">
<xsl:for-each select="@*">
<xsl:attribute name="{name()}">
<xsl:value-of select='.'/>
</xsl:attribute>
</xsl:for-each><xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match='text()'>
<xsl:value-of select='.'/>
</xsl:template>
<xsl:template match='comment()'>
<xsl:comment>
<xsl:value-of select='.'/>
</xsl:comment>
</xsl:template>
<xsl:template match='processing-instruction()'>
<xsl:processing-instruction name="{name()}">
<xsl:value-of select='.'/>
</xsl:processing-instruction>
</xsl:template>
</xsl:stylesheet>
Erläuterungen:
Das Beispiel enthält häufig als Attributwert "{name()}". Hier werden zwei neue Konstrukte eingeführt:
An dieser Stelle muß auf eine noch einfachere Methode verweisen werden, XML-Dokumente oder Teile davon zu kopieren. Das gleiche Ergebnis hätte auch folgendermaßen erzielt werden können: <?xml version="1.0" encoding="iso-8859-1" standalone="yes"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method='xml'/> <xsl:template match='/'> <xsl:apply-templates/> </xsl:template> <xsl:template match="@*|*|text()|comment()|processing-instruction()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>"copy" erzeugt Kopien von einzelnen Knoten anstatt sie explizit mit knotenspezifischen Anweisungen zu erzeugen. Dazu gibt es noch die Anweisung "copy-of", die ganze Dokumentfragmente kopiert, z.B.: <?xml version="1.0" encoding="iso-8859-1" standalone="yes"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method='xml'/> <xsl:template match='/'> <xsl:copy-of select="."/> </xsl:template> </xsl:stylesheet> Übungen
<root_node> <comment> Nichtssagender Kommentar 0</comment> <pi name="pi0" wert="Nichtssagende Verarbeitungsanweisung0 "/> <element name="abschnitt"> <attribut name="FileID" wert="BD5.xml"/> <text>Basisdokumentation für Tumorkranke, 5. Auflage</text> SchleifenverarbeitungGelegentlich ist es sinnvoll, Knotenmengen, die man zum Beispiel über apply-templates select="..." erhält, direkt in einer Schleife abzuarbeiten, anstatt sie an die Templateverarbeitung zu übergeben (z.B. keine Rekursion nötig, lesbarere Anweisungen). Dazu dient die Anweisung for-each select="..."., die bereits weiter oben beispielhaft eingeführt wurde.ÜbungErstellen Sie unter Nutzung von for-each ein Style Sheet, das aus bd5.xml die Bezeichnungen aller Wertelisten ausgibt.SortierenAls Unterelement von apply-templates und for-each können mit sort ein oder mehrere Sortierkriterien eingegeben werden.BeispielIm einleitenden Beispiel wurde die Knotenliste, die man über xsl:apply-templates select="wert" erhielt, nach dem Unterelement code sortiert.<xsl:template match="/abschnitt/abschnitt[@FileID='BD311w.xml']"> <table> <xsl:apply-templates select="wert"> <xsl:sort select="code"/> </xsl:apply-templates> </table> </xsl:template>Wenn man das select Attribut in sort wegläßt, wird der Wert des aktuellen Knotens benutzt. Für das Sortieren gibt es eine Reihe weiterer Attribute, mit denen sich Sortierkriterien und Ordnung weiter spezifizieren lassen, siehe Standard. ÜbungErweitern Sie das in der vorigen Übung erstellte Style Sheet so, daß es die Bezeichnungen der Wertelisten sortiert ausgibt.Variablen und ParameterXSLT erlaubt die Benutzung von Variablen und Parametern. Diesen können Zeichenketten, Zahlen, Wahrheitswerte, Knotenmengen und Dokumentfragmente sein. Die Besonderheit in XSLT ist, daß Werte von Variablen und Parametern immer nur nachfolgenden (sibling) Anweisungen und "nach unten" sichtbar sind. Eine Variable kennt sozusagen nicht einmal selbst ihren Wert, was bedeutet, daß so etwas wie "n = n+1" nicht funktioniert! Trotzdem gibt es eine Reihe nützlicher Anwendungen. Folgendes Style Sheet (ueberschrift.xsl) gibt die Überschriftengröße entsprechend der Tiefe, in der man sich im Dokument befindet, an (Ergebnis: ueberschrift.htm):<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method='html'/>
<xsl:template match='/'>
<html>
<xsl:apply-templates/>
</html>
</xsl:template>
<xsl:template match='abschnitt'>
<xsl:param name='l' select="1"/>
<!--Das Select-Attribut für Parameter-Variablen gibt den Vorgabewert an-->
<xsl:apply-templates select='ueberschrift'>
<xsl:with-param name='l'>
<xsl:value-of select="$l"/>
</xsl:with-param>
</xsl:apply-templates>
<xsl:apply-templates select='abschnitt'>
<xsl:with-param name='l'>
<xsl:value-of select="$l +1 "/>
</xsl:with-param>
</xsl:apply-templates>
</xsl:template>
<xsl:template match='ueberschrift'>
<xsl:param name='l' select="0"/>
<xsl:variable name='u'>
<xsl:value-of select="text()"/>
<xsl:comment>Dies ist ein Beispiel, wie eine Variable ein Dokumentfragment enthält</xsl:comment>
</xsl:variable>
<xsl:element name="{concat('h',$l)}">
<!-- concat "klebt" Zeichenketten -->
<xsl:copy-of select="$u"/>
</xsl:element>
</xsl:template>
<xsl:template match='*'>
<!--nichts tun-->
</xsl:template>
</xsl:stylesheet>
Bedingte VerarbeitungObwohl XSLT eine deklarative Sprache ist, wird neben Schleifenverarbeitung auch konditionelle Verarbeitung mit "if" bzw. "choose,when,otherwise" erlaubt. Das folgende Style Sheet (bd311tab.xsl) macht aus bd311.xml eine Tabelle (bd311tab.htm)<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method='html'/> <xsl:template match='/'> <html><body> <xsl:apply-templates/> </body></html> </xsl:template> <xsl:template match='*'> <xsl:choose> <xsl:when test="name()='abschnitt'"> <xsl:if test="contains(@FileID, 'w')"> <xsl:element name="table"> <xsl:apply-templates/> </xsl:element> </xsl:if> <xsl:if test="not(contains(@FileID, 'w'))"> <xsl:apply-templates/> </xsl:if> </xsl:when> <xsl:when test="name()='ueberschrift'"> <xsl:element name="h1"> <xsl:apply-templates/> </xsl:element> </xsl:when> <xsl:when test="name()='wert'"> <xsl:element name="tr"> <xsl:apply-templates/> </xsl:element> </xsl:when> <xsl:when test="(name()='code') or (name()='beschreibung' )"> <xsl:element name="td"> <xsl:apply-templates/> </xsl:element> </xsl:when> <xsl:otherwise> <xsl:copy-of select="."/> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet> VerarbeitungsmodiFür die Verarbeitung ist es manchmal notwendig, mehrfach in die Tiefe zu verzweigen, um zum Beispiel Inhaltsverzeichnisse und Volltexte zu erzeugen. Das folgende Style Sheet (ueberschrift2.xsl) erzeugt Links zu den entsprechenden Textstellen (Ergebnis: ueberschrift2.htm).<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method='html'/> <xsl:template match='/'> <html> <xsl:apply-templates mode="ueberschrift" select="abschnitt/abschnitt[not(contains(@FileID, 'w'))]"/> <xsl:apply-templates mode="volltext" select="abschnitt/abschnitt[not(contains(@FileID, 'w'))]"/> </html> </xsl:template> <xsl:template match='abschnitt' mode="ueberschrift"> <xsl:element name="a"> <xsl:attribute name="href"> #<xsl:value-of select="@FileID"/> </xsl:attribute> <xsl:value-of select="ueberschrift/text()"/> </xsl:element> <xsl:apply-templates mode="ueberschrift" select="*[name()='abschnitt' and not(contains(@FileID, 'w'))]" /> <br/> </xsl:template> <xsl:template match='abschnitt' mode="volltext"> <xsl:element name="a"> <xsl:attribute name="name"> <xsl:value-of select="@FileID"/> </xsl:attribute> <xsl:value-of select="ueberschrift/text()"/> </xsl:element> <xsl:apply-templates mode="volltext" select="*[name()='abschnitt' and not(contains(@FileID, 'w'))]" /> <br/> </xsl:template> </xsl:stylesheet> Weitere AnweisungenEine Einführung kann selbstverständlich nicht alle Facetten einer Sprache erwähnen. Im folgenden daher eine Auflistung weiterer Möglichkeiten
Standarddokumentehttp://www.w3.org/TR/xslt XSL Transformations (XSLT) Version 1.0 (W3C Recommendation)http://www.w3.org/TR/xpath XML Path Language. (W3C Recommendation) http://www.w3.org/TR/REC-xml Extensible Markup Language (XML) 1.0. (W3C Recommendation) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Back to the topic site: StudyPaper.com/Startseite/Computer/Internet External Links to this site are permitted without prior consent. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Home | deutsch | Set bookmark | Send a friend a link | Copyright © | Impressum | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||