XSLT Voraussetzungen, trivial

Download Report

Transcript XSLT Voraussetzungen, trivial

XSLT Voraussetzungen, trivial
XSLT-Prozessor: wir verwenden XALAN für die Erarbeitung.
XALAN kann über den NAL lokal am PC installiert werden.
XALAN ist eine JAVA-Anwendung.
XML-Datei, die bearbeitet werden soll (*.xml), wohlgeformt
XSLT-Stylesheet, das die Transformationsanweisungen enthält.
(*.xsl)
Ein Stylesheet mit Formatierungsklassen für unsere wichtigsten
Elemente und Standard-Text (*.css) [optional]
Eine DTD, optional
HTML
XML
XSL
XALAN
XML
CSS
TEXT
DTD
XLST
XSLT: Definition
XSLT = Extensible Stylesheet Language Transformations"
"XSLT ist eine funktionale Programmiersprache. Ihr Zweck
ist die Transformation eines XML-Dokumentes in ein
anderes Textdokument." Dies kann Text, HTML oder
XML sein.
XSLT: Namensraum und Version als Angabe im
Stylesheet
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
XLST
Grundlegender Aufbau eines Stylesheets
Ein Stylesheet ist selbst ein gültiges XML-Dokument. Es besitzt
folgenden Grundaufbau:
<?xml version = "1.0" ?>
<xsl:stylesheet version = "1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- TEMPLATES, Verarbeitungsanweisungen -->
</xsl:stylesheet>
Die Tags in Stylesheets werden mit Namensraum-Angaben
geschrieben. Dieser wird im Wurzelelement deklariert.
Beispiel:
<xsl:template match = "/">
<xsl:apply-templates />
</xsl:template>
XLST
Aufgabenstellung 1/1: Hallo Welt!
Wir beginnen mit einem einfachen, klassischen Beispiel:
Unsere XML-DATEI:
<?xml version="1.0"?>
<gruss>
Hallo, Welt!
</gruss>
XLST
Aufgabenstellung 1/2: Hallo Welt !
XSLT-Stylesheet:
<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 select="gruss" />
</body>
</html>
</xsl:template>
<xsl:template match="gruss">
<h1>
<xsl:value-of select="."/>
</h1>
</xsl:template>
</xsl:stylesheet>
XLST
Starten des Transformationsvorganges
In der DOS-Box:
java org.apache.xalan.xslt.Process -in gruss.xml -xsl
gruss.xsl -out gruss.html
... Ergibt die (aus dem Transformationsprozess
entstandene) Datei gruss.html
Zur Vereinfachung des Aufrufs kann man sich ein DOSSkript (Batch-Datei) bauen (go.bat)
XLST
Über die Ausgabe-Möglichkeiten
HTML
<xsl:output method="html"
doctype-public ="-//W3C//DTD HTML
4.01 Transitional//EN" />
xsl:output method = "text" />
TEXT
Programmcode
VRML-Code
...
<xsl:output method = "xml"
indent = "yes" />
XML
PDF
XLST
SVG
...
Bausteine des Stylesheets
Es gibt 37 XSLT-Elemente, davon 2 Hauptelemente, 12 Elemente
der obersten Ebene sowie 23 Anweisungselemente.
Bestimmte Elemente verwenden als Attribut Xpath-Ausdrücke.
Hauptelement
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
Element oberste
Ebene
<xsl:output method="html"/>
<xsl:template match="gruss">
<h1>
<xsl:value-of select="."/>
Xpath-Ausdruck
</h1>
</xsl:template>
Text, der in den
Ausgabestrom
geschrieben wird
Anweisungselement
XLST
Analyse des Beispiels (1)
1. Das XSLT-Stylesheet wird geparst und in eine
Baumstruktur überführt.
2. Das Gleiche passiert mit dem XML-Dokument.
3. Der Prozessor startet am Wurzelknoten des XMLDokuments. Dieser ist nicht das oberste Element,
sondern die "Wurzel des Dokuments" (inkl. aller
Verarbeitungsanweisungen etc.). Der Wurzelknoten ist
der Startkontext.
WURZEL
Verarbeitungsanweisungen,
wie <?xml-stylesheet .../>
Kommentare <!-- -->
Startkontext
Wurzelelement
<gruss .../>
Weitere Elemente
XLST
Analyse des Beispiels (2)
4. Prozessor: Muss ich irgendwelche Knoten verarbeiten?
Ja, es gibt weitere Knoten im Dokument. Und:
Es gibt ein "Template" (Vorlage, Schablone).
<xsl:template match = "/"> Kontext = /
5. Was soll ich tun?
<xsl:apply-templates select ="gruss" />
"Wähle die Kind-Knoten "gruss" und wende vorhandene
Templates auf sie an." Kontext = /gruss
WURZEL
Andere Knoten
auf der ersten
Ebene ...
Wurzelelement
<gruss .../>
XLST
Analyse des Beispiels (3)
6. Gibts ein spezielles Template für "gruss"?
Ja, und zwar:
<xsl:template match = "gruss">
7. Was muss ich jetzt tun?
Schreibe in den Ausgabestrom:
==> <h1>
Dann nimm den aktuellen Knoten (und ggf. seine
Kinderknoten) und schreibe deren "Inhalt":
==> <xsl:value-of select="."/>
Schreibe in den Ausgabestrom:
==> </h1>
8. Würde es weitere Knoten gruss geben, würde jetzt der
gruss [2] dran kommen. Dann kehrt der Prozessor zum
aufrufenden Template zurück.
XLST
Spannende, wundersame Tests / gruss2
1. Legen Sie ein neues Stylesheet mit Namen gruss2.xls
an.
2. Kopieren Sie die Daten vom alten Template in das neue
und löschen Sie daraus alle Templates!
3. Legen Sie auch eine neue XML-Datei gruss2.xml und
kopieren Sie dorthin die Inhalte von gruss1.xml.
4. Checken Sie die "Ausgabe" dieses Templates. Was tut
es?
5. Was ist daraus zu schließen?
6. Legen Sie nun ein "leeres" Template für den
Wurzelknoten an.
7. Prüfen Sie die Ausgabe und interpretieren Sie sie.
XLST
Aufgabenstellung 2/1:
Mehr Grüße im Manifest! / gruss2
Ändern Sie Ihren XML-File in gruss2.xml, senden Sie
mehrere Grüße an die Welt.
Binden Sie auch den Aufruf des Stylesheets ein.
Fügen Sie in ein wer-Element einen Kommentar ein.
Verwenden Sie dazu folgende Struktur:
<?xml-stylesheet type="text/xsl" href="gruss1.xsl" ?>
<!–- Einbindung des Stylesheets mit einer Verarbeitungsanweisung und
"Pseudoattributen" -->
<manifest>
<gruss>
<ansprache>
<wer sex="f|m">
<!-- -->
<wem>
<creator>
XLST
Aufgabenstellung 2/2: XSLT-Stylesheet / gruss2
Schreiben Sie jetzt ein Stylesheet (gruss2.xsl) für die
Transformation des neuen Texts.
1. Definieren Sie ein Template für den Wurzelknoten
<xsl:template match="/"> und bauen Sie dort das Skelett
der HTML-Seite. Im <body>-Element setzen Sie dann Schritt
2.
2. Teilen Sie dem Prozessor mit, dass er die Menge aller
gruss-Knoten (und der Kindknoten) bilden und mit der
vorhandenen Vorlage ausgeben soll. "<xsl:applytemplates select="manifest/gruss" />
3. Nun sollten Sie auch noch eine Vorlage für diese grussKnoten-Menge erstellen.
Wenn Sie damit schon fertig sind gehen Sie auf die nächste
Seite.
XLST
Aufgabenstellung 2/2: XSLT-Stylesheet
4. Erstellen Sie am Kopf der Seite ein Verzeichnis der
"Rufenden".
5. Erstellen Sie ein CSS-Stylesheet und bauen sie die Klassen in
die Ausgabe ein. Hier ein Vorschlag, die das geht:
(a) Sie müssen einen HTML-Header in die Ausgabe schreiben und
dort auf das CCS-File verweisen:
<link rel="STYLESHEET" type="text/css"
href="gruss.css" media="all" />
(b) Bei der Ausgabe des Elements geben Sie an:
<div>
<xsl:attribute name="class">liste</xsl:attribute>
[...Text...]
</div>
XLST
XPath: Definition
XPath ist eine Nicht-XML-Sprache, die dazu dient,
bestimmte Teile eines XML-Dokuments zu identifizieren.
XPath sieht das Dokument (*.xml) als einen Baum von
Knoten an. Für jedes Dokument gibt es genau einen
Wurzelknoten.
/manifest/gruss/wer lokalisiert die wer-Knoten
/ den Wurzelknoten selbst
XSLT benötigt XPath-Ausdrücke in bestimmten Attributen,
um Knoten oder andere Teile des Dokuments
auszuwählen, die verarbeitet werden sollen.
<xsl:apply-templates select="/manifest/gruss" />
XLST
XPath: Knoten (1)
XPath kennt 7 Arten von Knoten im XML-Dokument:
• Wurzelknoten: Der Knoten, der das gesamte
Dokument enthält. Adressierung mit /
• Elementknoten: Enthält das adressierte Element und
seine Kinder (Element-, Text-, Kommentar-,
Verarbeitungsanweisungsknoten)
• Attributknoten: Die Elementknoten, zu denen die
Attribute gehören, sind deren Elternknoten. Jedoch sind
Attributknoten sind keine Kinder ihres Elternknoten!
Nach Attributen müssen Sie speziell fragen.
XLST
XPath: Knoten (2)
• Textknoten: enthalten den Text aus einem Element.
Entity- und Zeichenreferenzen sowie CDATA-Abschnitte
werden aufgelöst.
• Kommentarknoten: Text der Kommentare
• Verarbeitungsknoten (PI-Knoten)
• Namensraum-Knoten
Kontextknoten ist die Bezeichnung für den gerade
gewählten, "aktuellen" Knoten. Xpath-Ausdrücke
werden von diesem Punkt aus berechnet. Kontextknoten
beinhalten noch weitere Informationen (Position, Größe
etc.)
XLST
XPath: Lokalisierungspfade
Ein Lokalisierungspfad bezeichnet eine Menge von Knoten in
einem gegebenen Dokument.
<xsl:template match = "/" /> wählt den Wurzelknoten
(und seine Kinder!) aus.
<xsl:template match = "gruss" />
wählt den Elementknoten gruss (und seine Kinder) relativ
zum Kontextknoten aus. gruss muss ein Kindknoten zum
Kontextknoten sein, in dem sich der XSLT-Prozess gerade
befindet.
Wieviele Knoten der XML-Datei werden damit ausgewählt?
<xsl:value-of select = "." /> wählt den gerade
aktivierten Kontextknoten (und seine Kinder).
Bitte beachten Sie, dass XPath-Ausdrücke immer
Knotenmengen zurückgeben! Und dass ein Knoten mehr
ist als nur sein Text, aber noch keine Attributwerte
beinhaltet.
XLST
XPath: Lokalisierungspfade: relativ
Ein relativer XPath-Adruck geht in der Adressierung immer
vom aktuellen Kontextknoten aus. Beispiele:
<xsl:template match = "gruss" /> setzt voraus, dass
gruss ein Kind des Kontextknotens (z.B. manifest) ist.
<xsl:value-of select = "." /> wählt den gerade
aktivierten Kontextknoten (und seine Kinder).
<xsl:template match = "manifest/gruss/wer" />.
Damit diese Adressierung keine leere Knotenmenge
zurückgibt, muss der Kontextknoten das Wurzelelement
sein.
<xsl:value-of select = ".." /> wählt den
Elternknoten des Kontextknoten. Ist der Kontextknoten
wer so wird gruss gewählt.
XLST
XPath: Lokalisierungspfade: absolut
Ein absoluter XPath-Ausdruck beginnt immer an der
Dokumentwurzel, d.h. mit einem /. Der Kontextkonten
wird nicht berücksichtigt.
<xsl:template match = "/" /> wählt das
Wurzelelement.
<xsl:template match = "/manifest/gruss/wer" />
adressiert das Element wer.
XLST
XPath: Lokalisierungsschritte für Attribute
Auch Attribute sind ein Teil von XPath. Allerdings sind sie
keine Kinder eines Elementknotens und werden daher
auch nicht automatisch selektiert. Sie müssen vielmehr
die Attribute explizit ansprechen.
<xsl:value-of select = "@sex" /> wählt das Attribut
"sex" des aktuellen Kontextknotens und gibt dessen
Wert aus.
<xsl: value-of select =
"/manifest/gruss/wer/@sex" /> adressiert das
Attribut absolut.
XLST
XPath: Nur den Text eines Knotens ausgeben
Wie Sie wissen, werden bei der Selektion eines
Elementknotens alle untergeordneten Kinderknoten
(auch jene, die keine Elementknoten, sondern etwa
auch Kommentarknoten etc. sind) mit ausgewählt.
Wollen Sie nur den Textknoten eines Elements
ausgeben, verwenden Sie den "Knotentest" text()
<xsl: value-of select = "/manifest/gruss/text()"
/> gibt nur den Text des gruss-Elements aus.
XLST
XPath: Wildcards, mehrere Treffer
Wildcards sprechen unterschiedliche Element- und Knotentypen
gleichzeitig an.
* wählt alle Elementknoten aus (nicht aber: Attribute,
Textknoten, Kommentare, PIs). Z.B. wählt dc:* alle
Elementknoten des Namensraums dc aus.
@* wählt alle Attributknoten.
node() wählt alle Knoten im aktuellen Kontext.
// wählt unter allen Abkömmlingen des Kontextknotens und dem
Kontextknoten: z.B. wählt //wer alle wer-Elemente.
| undiert XPath-Ausdrücke und liefert die Vereinigungsmenge
beider Ausdrücke.
XLST
XPath: Kommentare und Text auswählen
comment() Dieser Knotentest liefert den Inhalt des
Kommentars im jeweiligen Kontext.
text() Liefert den Textinhalt eines Kontextknotens (nicht
aber die der Kindelemente)
XLST
Aufgabengabenstellung 3 / gruss3
1. Kopieren Sie den Inhalt von gruss1.xml -> gruss3.xml
2. Erstellen Sie ein neues Stylesheet gruss3.xsl
3. Geben Sie eine Liste aller im Dokument vorhandenen
Attribute aus.
4. Geben Sie die Kommentare aus.
5. Geben Sie alle Elemente ohne Templates aus.
6. Geben den Inhalt der Elemente /manifest/gruss/wer
aus.
Immer denken: Ich super und kann's!
XLST
XPath: Prädikate, Funktionen, Zahlen
Manchmal ist es notwendig, die Treffermenge der
gefundenen Knoten weiter zu filtern. Dies kann durch
"Prädikate" geschehen. Prädikate beinhalten eine
Bedingung bzw. einen Ausdruck, der wahr oder falsch
ist (Boolscher Wert). Ist der Ausdruck für einen Knoten
falsch, wird er aus der Liste gelöscht.
Beispiele:
manifest/gruss/wer[@sex='m']
manifest/gruss[wer = "Jaques Brel"]
manifest/gruss[1]
Im Rahmen von Prädikaten werden häufig auch Funktionen
und Zahlenoperationen verwendet.
XLST
XPath: Funktionen
Funktionen arbeiten mit Knotenmengen oder geben
Informationen über Knotenmengen zurück. Funktionen
liefern Daten folgender Typen zurück: Boolscher Wert,
Zahl, Knotenmenge, String.
Beispiele für Funktionen:
last()
count()
position()
name()
string()
starts-with()
contains(), substring()
subsstring-before(), substring-after()
string-length()
not()
XLST
XPath: Mathematische Operatoren
In XPath-Ausdrücken kann auch gerechnet werden:
+ Addition
- Subtraktion gruss[last()-1] => vorletzter Knoten
* Multiplikation
div Division 6,5 div 3 => 2
mod Restbildung 6,5 mod 1,5 => 0,5
starts-with()
contains(), substring()
subsstring-before(), substring-after()
string-length()
not()
XLST
XSLT: Verzweigungselemente
IF-Element
<xsl:if test = "count(//wer) = 5">
[...]
</xsl:if>
CHOOSE-Element
<xsl:choose>
<xsl:when test = [Bedingung]> [...Ausgabe...]
</xsl:when> [...weitere Bedingungen...]
<xsl:otherwise>[...]
</xsl:otherwise>
</xsl:choose>
XLST