Weil eine XML-Sprache ein bestimmtes Vokabular repräsentiert, kommt oft der Wunsch auf, verschiedene Vokabulare in etwas anderes zu transformieren. Dies kann entweder ein anderes XML-Vokabular sein (zum Beispiel beim Datenaustausch), oder beispielsweise auch HTML (zum Publizieren von Daten im Web). Mit XSL Transformations (XSLT) können solche Abbildungen leicht erstellt werden. XSLT macht sich die Mächtigkeit von XPath zunutze und setzt es in der recht einfach zu verwendenden Programmiersprache ein. Die Programme in XSLT werden oft auch Stylesheets genannt. Einfache Aufgaben können mit XSLT ohne viel Programmierarbeit erledigt werden. Es wird ausschließlich spezifiziert, wie die Bestandteile einer Ausgangssprache in die Bestandteile einer Zielsprache abgebildet werden sollen. Dennoch stellt XSLT eine Turing-vollständige Programmiersprache dar.
Man unterscheidet üblicherweise zwei Programmierparadigmen.
Die objektorientierte Programmierung läßt sich nicht in diese Klassifizierung einordnen, sie ist hierzu orthogonal (vgl. Einführung in die Informatik von Barbara König ). Es gibt sowohl imperative objektorientierte Sprachen (z.B. Java, C++) als auch deklarative objektorientierte Sprachen (z.B. OCaml).
Die
funktionale Programmierung
ist der deklarativen Programmierung zuzuordnen.
Als Grundlage dient der Begriff der
Funktion
, der stark auf dem Funktionsbegriff der Mathematik
basiert. Eine Funktion besitzt einen
Definitionsbereich, einen Wertebereich, sowie eine
Abbildungsvorschrift (Aufzählung von Wertepaaren
oder Funktionsgleichung). Eine Funktionsgleichung
besitzt auf der linken Seite Variablen, die mit
Werten aus dem Definitionsbereich belegt werden
können. Auf der rechten Seite steht ein Ausdruck mit
Konstanten (z.B. e, Pi) und Funktionen. Beispiel:
K(r) = pi * r
2
. In einer funktionalen Programmiersprache kann
diese Funktion auf die gleiche Art und Weise
definiert und benutzt werden wie in der Mathematik.
(Quelle: Martin Erwig: Grundlagen funktionaler
Programmierung, Oldenbourg Verlag, ISBN
3-486-25100-7)
Eigenschaften funktionaler Programmiersprachen
i=i+1
. Mathematisch eine nicht erfüllbare Aussage,
steht in imperativen Programmiersprachen das
i
links des Gleichheitszeichens etwa für eine
8
, das
i
rechts des Gleichheitszeichens hingegen für eine
7
.
while
oder
for
.
if-then-else
.
<?xml version="1.0" encoding="UTF-8"?> <xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"/>
java net.sf.saxon.Transform -s pfad_quelldokument -o pfad_zieldokument pfad_stylesheetdokument
java net.sf.saxon.Transform -s projektverwaltung-erweitert.xml -o transformationsergebnis.xml first-xslt.xml
Textdes Dokuments erscheint im Ergebnisdokument.
Vorgaberegeln.

<?xml version="1.0" encoding="UTF-8"?> <xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="Person"> <xsl:text>Person gefunden!</xsl:text> </xsl:template> </xsl:transform>
findetautomatisch die richtigen Knoten. Die Ausführung des Codes wird durch den XSLT-Prozessor kontrolliert, er wendet die
Regelnan.
xsl:text
)
Person gefunden!
; für jedes Auftreten des Knotens Person in der
Eingabe. (
Download des Transformationsergebnisses
)
<?xml version="1.0" encoding="UTF-8"?> Person gefunden! Person gefunden! Person gefunden!
xsl:if
und
xsl:choose
). Diese sollten jedoch nur für einfache
Bedingungen verwendet werden. Tiefe
Schachtelungen und lange Bedingungen werden
schnell zum Problem (Lesbarkeit, Performance).
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="/ | *"> <xsl:text>( Element: </xsl:text> <xsl:value-of select="local-name()"/> <xsl:apply-templates select="@* | *"/> <xsl:text>) </xsl:text> </xsl:template> <xsl:template match="@*"> <xsl:text>Attribute: </xsl:text> <xsl:value-of select="local-name()"/> </xsl:template> </xsl:stylesheet>
xsl:stylesheet
-Elements anstatt des
xsl:transform
-Elements. Die beiden Elemente sind synonym -
beiden können gleichsinnig verwendet werden.
/
) zu, zum anderen auf beliebige Elemente
innerhalb eines Dokuments (
*
).
( Element
Elementname
) aus. Anschließend wird der Prozessor
veranlaßt, Attribute und Kindelemente zu
verarbeiten.
@*
).
Attribute:
gefolgt vom Namen des Attributs
xsl:apply-templates
) zu bewerkstelligen, die meiste Arbeit
übernimmt der XSLT-Prozessor selbst.
( Element: ( Element: ProjektVerwaltungAttribute: noNamespaceSchemaLocation( Element: PersonAttribute: PersIDAttribute: mitarbeitInProjekt( Element: Vorname) ( Element: Nachname) ) ( Element: PersonAttribute: PersIDAttribute: mitarbeitInProjekt( Element: Vorname) ( Element: Vorname) ( Element: Nachname) ( Element: Qualifikationsprofil( Element: u) ( Element: em) ( Element: Leistungsstufe) ( Element: em( Element: Qualifikation) ) ( Element: em( Element: u( Element: Qualifikation) ) ) ( Element: u( Element: Qualifikation) ) ( Element: b) ) ) ( Element: PersonAttribute: PersIDAttribute: mitarbeitInProjekt( Element: Vorname) ( Element: Nachname) ( Element: GeburtsnameAttribute: value) ) ( Element: ProjektAttribute: IDAttribute: ProjektleiterAttribute: Mitarbeiter) ( Element: ProjektAttribute: IDAttribute: ProjektleiterAttribute: Mitarbeiter) ) )
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="/ | *"> (Element: <xsl:value-of select="local-name()"/><xsl:apply-templates select="@* | *"/>) </xsl:template> <xsl:template match="@*"> Attribute: <xsl:value-of select="local-name()"/> </xsl:template> </xsl:stylesheet>
xsl:text
ausgegeben werden, sondern einfach dadurch, daß
der gewünschte Text in die Elementschablone
hineingeschrieben wird.
(Element: (Element: ProjektVerwaltung Attribute: noNamespaceSchemaLocation (Element: Person Attribute: PersID Attribute: mitarbeitInProjekt (Element: Vorname) (Element: Nachname) ) (Element: Person Attribute: PersID Attribute: mitarbeitInProjekt (Element: Vorname) (Element: Vorname) (Element: Nachname) (Element: Qualifikationsprofil (Element: u) (Element: em) (Element: Leistungsstufe) (Element: em (Element: Qualifikation) ) (Element: em (Element: u (Element: Qualifikation) ) ) (Element: u (Element: Qualifikation) ) (Element: b) ) ) (Element: Person Attribute: PersID Attribute: mitarbeitInProjekt (Element: Vorname) (Element: Nachname) (Element: Geburtsname Attribute: value) ) (Element: Projekt Attribute: ID Attribute: Projektleiter Attribute: Mitarbeiter) (Element: Projekt Attribute: ID Attribute: Projektleiter Attribute: Mitarbeiter) ) )
<?xml version="1.0" encoding="UTF-8"?> <xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="Person"> <Mitarbeiter/> </xsl:template> </xsl:transform>
Person
durch ein leeres
Mitarbeiter
-Element ersetzt.
Mitarbeiter
anstelle der
Person
en-Elemente der Eingabe. (
Download des Transformationsergebnisses
)
<?xml version="1.0" encoding="UTF-8"?> <Mitarbeiter/> <Mitarbeiter/> <Mitarbeiter/>
xsl:value-of
)
<?xml version="1.0" encoding="UTF-8"?> <xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="Person"> <Mitarbeiter> <xsl:value-of select="self::*"/> </Mitarbeiter> </xsl:template> </xsl:transform>
xsl:value-of
erlaubt dies.
select
-Attributs ausgewählt.
<?xml version="1.0" encoding="UTF-8"?>
<Mitarbeiter>
Hans
Hinterhuber
</Mitarbeiter>
<Mitarbeiter>
Franz
Xaver
Obermüller
IT-Kompetenz
verschiedene Betriebssysteme und
professionelle
Programmierung
verschiedener Programmiersprachen
Entwickler
von 1988-1990
Projektleiterfunktion
von 1990-93 im X42-Projekt in Abteilung AB&C
</Mitarbeiter>
<Mitarbeiter>
Fritz
Meier
</Mitarbeiter>
xsl:copy-of
)
<?xml version="1.0" encoding="UTF-8"?> <xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="//Person"> <Mitarbeiter> <xsl:copy-of select="child::*"/> </Mitarbeiter> </xsl:template> </xsl:transform>
Person
in
Mitarbeiter
um.
select
-Ausdruck der Schablone ist in diesem Beispiel
die in XSLT optionale
descendant
-Achse (
//
) mit angegeben.
copy-of
übernimmt ein vollständiges Element
einschließlich der Auszeichnungssymbole
unverändert in die Ausgabe.
select
-Attribut des
copy-of
-Elements die
child
-Achse verwendet.
child
-Achse nicht angegeben und stattdessen die
self
-Achse verwendet, würden auch die
Personen-Knoten selbst in die Ausgabe
übernommen werden.
xsl:......
) in der Schablone stellen Anweisungen dar.
apply-templates
hat eine Sonderrolle - es wählt Knoten aus,
die verarbeitet werden sollen.
match
-Attribute definiert, welche Knoten des
Quelldokuments durch ein Template bearbeitet
werden. Für jeden Knoten, der so ausgewählt
wird, wird die Schablone ausgeführt /
angewendet. Der jeweils ausgewählte Knoten
stellt den Kontext für die Ausführung der
Schablone dar (d.h. XPath-Ausdrücke
innerhalb der Schablone werden relativ zu
diesem Knoten ausgewertet).
xsl:apply-templates
wählt zunächst die Knoten aus, die
verarbeitet werden sollen.
am besten geeigneteSchablone und führt sie aus.
spezifischsteSchablone ausgewählt. (Daumenregel)
<?xml version="1.0" encoding="UTF-8"?> <xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="Person"> <Mitarbeiter> <xsl:value-of select="self::*"/> </Mitarbeiter> </xsl:template> <xsl:template match="Person[Qualifikationsprofil]"> <Qualifizierter_Mitarbeiter> <xsl:value-of select="self::*"/> </Qualifizierter_Mitarbeiter> </xsl:template> </xsl:transform>
<?xml version="1.0" encoding="UTF-8"?>
<Mitarbeiter>
Hans
Hinterhuber
</Mitarbeiter>
<Qualifizierter_Mitarbeiter>
Franz
Xaver
Obermüller
IT-Kompetenz
verschiedene Betriebssysteme und
professionelle
Programmierung
verschiedener Programmiersprachen
Entwickler
von 1988-1990
Projektleiterfunktion
von 1990-93 im X42-Projekt in Abteilung AB&C
</Qualifizierter_Mitarbeiter>
<Mitarbeiter>
Fritz
Meier
</Mitarbeiter>
oder
verknüpfte XPath-Ausdrücke im
match
-Attribut werden als verschiedene
unterschiedliche Schablonen behandelt.
*
erhält die Priorität
-0.5
0
.
0.25
.
0.5

Quelle: XML-Vorlesung von Erik Wilde
<?xml version="1.0" encoding="UTF-8"?> <c> <b> <a/> </b> </c>
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:apply-templates select="descendant::a"/> </xsl:template> <xsl:template match="*"/> <xsl:template match="a"/> <xsl:template match="b/a"/> <xsl:template match="c/b/a"/> </xsl:stylesheet>
F:\bsz\webseite\src\vorlesung>java net.sf.saxon.Transform -s conflict-resolution.xml -o conflictresult.xml conflict-resolution.xsl Error on line 4 of file:/F:/bsz/webseite/src/vorlesung/conflict-resolution.xsl: XTRE0540: Ambiguous rule match for /c/b[1]/a[1] Matches both "c/b/a" on line 9 of file:/F:/bsz/webseite/src/vorlesung/conflict-resolution.xsl and "b/a" on line 8 of file:/F:/bsz/webseite/src/vorlesung/conflict-resolution.xsl
<xsl:template match="..."
priority="1">
xsl:message
) aus, welche Schablone für die Transformation
verwendet wurde.
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:apply-templates select="descendant::a"/> </xsl:template> <xsl:template match="*"><xsl:message>Schablone 1</xsl:message></xsl:template> <xsl:template match="a"><xsl:message>Schablone 2</xsl:message></xsl:template> <xsl:template match="b/a"><xsl:message>Schablone 3</xsl:message></xsl:template> <xsl:template match="c/b/a" priority="1"><xsl:message>Schablone 4</xsl:message></xsl:template> </xsl:stylesheet>
F:\bsz\webseite\src\vorlesung>java net.sf.saxon.Transform -s conflict-resolution.xml -o ergebnis-mit-prioritaeten.xml conflict-resolution-priority.xsl
Schablone 4
-T
die Ausgabe von Tracing-Information zu
aktivieren.
F:\bsz\webseite\src\vorlesung>java net.sf.saxon.Transform -s conflict-resolution .xml -o ergebnis-mit-prioritaeten.xml -T conflict-resolution-priority.xsl
<trace saxon-version="8.9" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<source node="/" line="0" file="conflict-resolution.xml">
<xsl:template match="/" line="3" module="conflict-resolution-priority.xsl">
<source node="/c/b[1]/a[1]" line="4" file="conflict-resolution.xml">
<xsl:template match="c/b/a" priority="1" line="9" module="conflict-resolutio
n-priority.xsl">
Schablone 4
</xsl:template>
</source><!-- /c/b[1]/a[1] -->
</xsl:template>
</source><!-- / -->
</trace><?xml version="1.0" encoding="UTF-8"?> <xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="Person"> <Mitarbeiter> <xsl:apply-templates/> </Mitarbeiter> </xsl:template> <xsl:template match="Qualifikationsprofil"/> <xsl:template match="attribute::*|node()"> <xsl:copy> <xsl:apply-templates select="attribute::*|node()"/> </xsl:copy> </xsl:template> </xsl:transform>
Qualifikationsprofil
-Knoten, ohne Ersetzungsmuster. In der
Konsequenz wird dieses Element sowie der
Teilbaum darunter nicht in die Ausgabe
übernommen.
node()
-Funktion) sowie auf alle Attributeknoten (
attribute::*
).
xsl:copy
. Es übernimmt das aktuelle Element in das
Ergebnis und läßt dabei eventuelle Kindelemente
außer acht. Dies wird auch als
shallow copy
bezeichnet
apply-templates
xsl:apply-templates
darauf Einfluß zu nehmen.
<?xml version="1.0" encoding="UTF-8"?> <xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="Person"> <Mitarbeiter> <xsl:apply-templates/> </Mitarbeiter> </xsl:template> <xsl:template match="Qualifikationsprofil"/> <xsl:template match="attribute::*|node()"> <xsl:copy> <xsl:apply-templates select="attribute::*|node()"/> </xsl:copy> </xsl:template> </xsl:transform>
Person
en-Knoten in der Eingabe gefunden wurde und das
öffnende Tag
Mitarbeiter
ausgegeben wurde, wird nach weiteren Knoten im
Eingabedokument gesucht, auf die Schablonen im
XSLT-Programm zutreffen.
attribute::*|node()
zugänglich sind.
apply-templates
-Element im „allgemeinen“ (dritten) Template das
Attribut
select
. Es erlaubt dem Programmierer, die Knoten
auszuwählen, für die nach weiteren passenden
Schablonen gesucht werden soll.
<?xml version="1.0" encoding="UTF-8"?><ProjektVerwaltung xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="L:\vorlesung\src\projektverwaltung-erweitert.xsd"> <Mitarbeiter> <Vorname>Hans</Vorname> <Nachname>Hinterhuber</Nachname> </Mitarbeiter> <Mitarbeiter> <Vorname>Franz</Vorname> <Vorname>Xaver</Vorname> <Nachname>Obermüller</Nachname> </Mitarbeiter> <Mitarbeiter> <Vorname>Fritz</Vorname> <Nachname>Meier</Nachname> <Geburtsname value="Huber"/> </Mitarbeiter> <Projekt ID="Prj01" Projektleiter="Pers01" Mitarbeiter="Pers01"/> <Projekt ID="Prj02" Projektleiter="Pers02" Mitarbeiter="Pers03"/> </ProjektVerwaltung>
match
-Attribut zu definieren.
xsl:call-template
aufgerufen werden.
match
-Attributs einen eindeutigen Namen.
<xsl:call-template name="QName"> </xsl:call-template>
<xsl:call-template name="QName"> <xsl:with-param name="QName" select="eingeschränkter XPath-Ausdruck"></xsl:with-param> </xsl:call-template>
<xsl:template match="li">
<xsl:call-template name="numbered-block">
<xsl:with-param name="format">a. </xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="numbered-block">
<xsl:param name="format">1. </xsl:param>
<fo:block>
<xsl:number format="{$format}"/>
<xsl:apply-templates/>
</fo:block>
</xsl:template>1.
des Elements
xsl:param
innerhalb der Schablone namens
numbered-block
dient als
Vorgabewert
für den
format
-Parameter. Wird in der Parameterübergabe kein
Wert definiert, dann wird dieser Vorgabewert
verwendet.
a.
übergeben, als Inhalt des
format
-Parameters
xsl:with-param
. Der übergebene Wert
stichtden vorgegebenen Wert.
xsl:if
xsl:if
-Anweisung ist es möglich, bedingte Anweisungen
in XSLT-Programmen zu nutzen.
xsl:if
-Anweisung wird nur dann vom Prozessor
bearbeitet, wenn die im
test
-Attribut formulierte Boole'sche Bedingung wahr
ist
<xsl:if test="Boole'scher Ausdruck"> <!-- Inhalt --> </xsl:if>
Person
en, die mehr als einen
Vorname
n haben, wird auf der Kommandozeile der
angegebene Text (unter Auswertung des Inhalts
von
Nachname
) ausgegeben.
>
wird durch die Zeichenfolge
>
ersetzt, da Auszeichnunssymbole in
Attributwerten in XML bekanntermaßen nicht
erlaubt sind.
<?xml version="1.0" encoding="UTF-8"?> <xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="Person"> <Mitarbeiter> <xsl:if test="count(Vorname)>1"> <xsl:message><xsl:value-of select="Nachname"/> hat mehr als einen Vornamen!</xsl:message> </xsl:if> <xsl:apply-templates/> </Mitarbeiter> </xsl:template> <xsl:template match="Qualifikationsprofil"/> <xsl:template match="attribute::*|node()"> <xsl:copy> <xsl:apply-templates select="attribute::*|node()"/> </xsl:copy> </xsl:template> </xsl:transform>
F:\bsz\webseite\src\vorlesung>java net.sf.saxon.Transform -s projektverwaltung-erweitert.xml -o ergebnis-xsl-if-2.txt xsl-if-2.xsl Oberm³ller hat mehr als einen Vornamen!
<?xml version="1.0" encoding="UTF-8"?><ProjektVerwaltung xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="L:\vorlesung\src\projektverwaltung-erweitert.xsd"> <Mitarbeiter> <Vorname>Hans</Vorname> <Nachname>Hinterhuber</Nachname> </Mitarbeiter> <Mitarbeiter> <Vorname>Franz</Vorname> <Vorname>Xaver</Vorname> <Nachname>Obermüller</Nachname> </Mitarbeiter> <Mitarbeiter> <Vorname>Fritz</Vorname> <Nachname>Meier</Nachname> <Geburtsname value="Huber"/> </Mitarbeiter> <Projekt ID="Prj01" Projektleiter="Pers01" Mitarbeiter="Pers01"/> <Projekt ID="Prj02" Projektleiter="Pers02" Mitarbeiter="Pers03"/> </ProjektVerwaltung>
xsl:choose
xsl:choose
-Anweisung wird Mehrfachselektion möglich.
if-then-else
-Struktur abgebildet werden.
<xsl:choose> <!-- Inhalt: (xsl:when+, xsl:otherwise?) --> </xsl:choose> <xsl:when test="Boole'scher Ausdruck"> <!-- Inhalt --> </xsl:when> <xsl:otherwise> <!-- Inhalt --> </xsl:otherwise>
<?xml version="1.0" encoding="UTF-16" standalone="yes"?>
<europa>
<nation>
<name>Belgien</name>
<population>10.4</population>
</nation>
<nation>
<name>Tschechische Republik</name>
<population>10.2</population>
</nation>
<nation>
<name>Dänemark</name>
<population>5.4</population>
</nation>
<nation>
<name>Deutschland</name>
<population>82.5</population>
</nation>
<nation>
<name>Estland</name>
<population>1.3</population>
</nation>
<nation>
<name>Griechenland</name>
<population>11.1</population>
</nation>
<nation>
<name>Spanien</name>
<population>38.2</population>
</nation>
<nation>
<name>Frankreich</name>
<population>60.6</population>
</nation>
<nation>
<name>Irland</name>
<population>4.0</population>
</nation>
<nation>
<name>Italien</name>
<population>58.5</population>
</nation>
<nation>
<name>Zypern</name>
<population>0.7</population>
</nation>
<nation>
<name>Lettland</name>
<population>2.3</population>
</nation>
<nation>
<name>Litauen</name>
<population>3.4</population>
</nation>
<nation>
<name>Luxemburg</name>
<population>0.5</population>
</nation>
<nation>
<name>Ungarn</name>
<population>10.1</population>
</nation>
<nation>
<name>Malta</name>
<population>0.4</population>
</nation>
<nation>
<name>Niederlande</name>
<population>16.3</population>
</nation>
<nation>
<name>Österreich</name>
<population>8.2</population>
</nation>
<nation>
<name>Polen</name>
<population>38.2</population>
</nation>
<nation>
<name>Portugal</name>
<population>10.5</population>
</nation>
<nation>
<name>Slowenien</name>
<population>2.0</population>
</nation>
<nation>
<name>Slowakei</name>
<population>5.4</population>
</nation>
<nation>
<name>Finnland</name>
<population>5.2</population>
</nation>
<nation>
<name>Schweden</name>
<population>9.0</population>
</nation>
<nation>
<name>Vereinigtes Königreich</name>
<population>60.0</population>
</nation>
</europa>xsl:choose
-Anweisung um abhängig von der Bevölkerungszahl
des jeweiligen Landes den Namen des Landes
auszugeben oder den Text
(-- zu klein --)
.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"></xsl:output>
<xsl:template match="europa">
<xsl:apply-templates select="nation"></xsl:apply-templates>
</xsl:template>
<xsl:template match="nation">
<xsl:choose>
<xsl:when test="population > 10">
<xsl:text> </xsl:text>
<xsl:value-of select="name"/>
<xsl:text> </xsl:text>
</xsl:when>
<xsl:when test="population < 10">
<xsl:text> (-- zu klein --)</xsl:text>
</xsl:when>
<!-- Hier stünde eine eventuelle xsl:otherwise-Anweisung -->
</xsl:choose>
</xsl:template>
</xsl:stylesheet>Belgien Tschechische Republik (-- zu klein --) Deutschland (-- zu klein --) Griechenland Spanien Frankreich (-- zu klein --) Italien (-- zu klein --) (-- zu klein --) (-- zu klein --) (-- zu klein --) Ungarn (-- zu klein --) Niederlande (-- zu klein --) Polen Portugal (-- zu klein --) (-- zu klein --) (-- zu klein --) (-- zu klein --) Vereinigtes Königreich
/
) erzeugt.
body
werden innerhalb des Quelldokuments beliebige
weitere Knoten gesucht, die auf eines der
angegebenen Suchmuster passen (
xsl:apply-templates
).
<?xml version="1.0"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="ISO-8859-1" omit-xml-declaration="no" indent="yes" xmlns="http://www.w3.org/1999/xhtml" /> <xsl:template match="/"> <html> <head> <title>XML-Vorlesung Wintersemester 2007/2008 -- Projektverwaltung</title> </head> <body> <xsl:apply-templates/> </body> </html> </xsl:template>
ProjektVerwaltung
ein paar Überschriftszeilen und der Kopf einer
XHTML-Tabelle.
table
und der Kopfzeile (eingeschlossen durch
tr
)
Projekt
beschränkt (
select
-Attribut des
apply-templates
-Elements).
<xsl:template match="ProjektVerwaltung"> <center><h1>Projektverwaltung</h1></center> <h2>Projekte</h2> <table border="1"> <tr> <td><b>Projektnummer</b></td> <td><b>Projektleiter</b></td> </tr> <xsl:apply-templates select="Projekt"/> </table>
Projekt
speichert zunächst den Inhalt des Attributs
Projektleiter
in einer Variable namens
prjLeiter
.
Projektverwaltung
geöffnete Tabelle befüllt.
Projektnummer
) die
ID
des jeweiligen Projektes geschrieben. Sie wird
in einen Anker (
a
) eingebettet, dessen
name
-Attribut ebenfalls die
ID
des Projektes als Wert erhält. Dies dient einer
späteren Verlinkung.
Projektleiter
) wird der
Nachname
derjenigen
Person
geschrieben, deren ID (Wert des Attributs
PersID
) mit dem Wert der zuvor angelegten Variablen
prjLeiter
übereinstimmt.
generate-id()
generierter eindeutiger ID-Wert.
<xsl:template match="Projekt">
<xsl:variable name="prjLeiter" select="@Projektleiter"/>
<tr>
<td>
<xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@ID"/></xsl:attribute>
<xsl:value-of select="@ID"/>
</xsl:element>
</td>
<td>
<xsl:element name="a">
<xsl:attribute name="href">#<xsl:value-of select="generate-id(//Person[@PersID=$prjLeiter]/Nachname)"/></xsl:attribute>
<xsl:value-of select="//Person[@PersID=$prjLeiter]/Nachname"/>
</xsl:element>
</td>
</tr>
</xsl:template>ProjektVerwaltung
erzeugt eine Tabelle für die Personen der
Projektverwaltung.
Person
beschränkt.
<h2>Mitarbeiter</h2> <table border="1"> <tr> <td><b>Name</b></td> <td><b>Projekt</b></td> </tr> <xsl:apply-templates select="Person"/> </table>
Person
speichert zunächst den Inhalt des Attributs
PersID
in einer Variable.
Projektverwaltung
geöffnete Tabelle befüllt.
Vorname
bzw.
Nachname
aktiviert.
Projekt
en. Als Sprungziel wird hierbei der Inhalt des
Attributs
mitarbeitInProjekt
eingetragen.
<xsl:template match="Person">
<xsl:variable name="persNr" select="@PersID"/>
<tr>
<td><xsl:apply-templates select="Vorname[parent::Person/@PersID=$persNr]"/> 
<xsl:apply-templates select="Nachname[parent::Person/@PersID=$persNr]"/></td>
<td>
<xsl:element name="a">
<xsl:attribute name="href">#<xsl:value-of select="@mitarbeitInProjekt"/></xsl:attribute>
<xsl:value-of select="@mitarbeitInProjekt"/>
</xsl:element>
</td>
</tr>
</xsl:template>Vorname
und
Nachname
geben im Wesentlichen den Wert des Knotens aus,
der zweite Vorname fügt ein Leerzeichen vor der
Textausgabe ein. Für
Nachname
wird ein Anker mit der automatisch generierten
ID für den Wert des Knotens generiert (das
Sprungziel des in der Schablone für
Projekt
generierten Hyperlinks).
<xsl:template match="Vorname"> <xsl:value-of select="."/> </xsl:template> <xsl:template match="Vorname[position() > 1]"> <xsl:text> </xsl:text><xsl:value-of select="."/> </xsl:template> <xsl:template match="Nachname"> <xsl:element name="a"> <xsl:attribute name="name"><xsl:value-of select="generate-id()"/></xsl:attribute> <xsl:value-of select="."/> </xsl:element> </xsl:template>
<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="ISO-8859-1" omit-xml-declaration="no" indent="yes"
xmlns="http://www.w3.org/1999/xhtml" />
<xsl:template match="/">
<html>
<head>
<title>XML-Vorlesung Wintersemester 2007/2008 -- Projektverwaltung</title>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="ProjektVerwaltung">
<center><h1>Projektverwaltung</h1></center>
<h2>Projekte</h2>
<table border="1">
<tr>
<td><b>Projektnummer</b></td>
<td><b>Projektleiter</b></td>
</tr>
<xsl:apply-templates select="Projekt"/>
</table>
<h2>Mitarbeiter</h2>
<table border="1">
<tr>
<td><b>Name</b></td>
<td><b>Projekt</b></td>
</tr>
<xsl:apply-templates select="Person"/>
</table>
</xsl:template>
<xsl:template match="Projekt">
<xsl:variable name="prjLeiter" select="@Projektleiter"/>
<tr>
<td>
<xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="@ID"/></xsl:attribute>
<xsl:value-of select="@ID"/>
</xsl:element>
</td>
<td>
<xsl:element name="a">
<xsl:attribute name="href">#<xsl:value-of select="generate-id(//Person[@PersID=$prjLeiter]/Nachname)"/></xsl:attribute>
<xsl:value-of select="//Person[@PersID=$prjLeiter]/Nachname"/>
</xsl:element>
</td>
</tr>
</xsl:template>
<xsl:template match="Person">
<xsl:variable name="persNr" select="@PersID"/>
<tr>
<td><xsl:apply-templates select="Vorname[parent::Person/@PersID=$persNr]"/> 
<xsl:apply-templates select="Nachname[parent::Person/@PersID=$persNr]"/></td>
<td>
<xsl:element name="a">
<xsl:attribute name="href">#<xsl:value-of select="@mitarbeitInProjekt"/></xsl:attribute>
<xsl:value-of select="@mitarbeitInProjekt"/>
</xsl:element>
</td>
</tr>
</xsl:template>
<xsl:template match="Vorname">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="Vorname[position() > 1]">
<xsl:text> </xsl:text><xsl:value-of select="."/>
</xsl:template>
<xsl:template match="Nachname">
<xsl:element name="a">
<xsl:attribute name="name"><xsl:value-of select="generate-id()"/></xsl:attribute>
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
<?xml version="1.0" encoding="ISO-8859-1"?>
<html>
<head>
<title>XML-Vorlesung Wintersemester 2007/2008 -- Projektverwaltung</title>
</head>
<body>
<center>
<h1>Projektverwaltung</h1>
</center>
<h2>Projekte</h2>
<table border="1">
<tr>
<td>
<b>Projektnummer</b>
</td>
<td>
<b>Projektleiter</b>
</td>
</tr>
<tr>
<td>
<a name="Prj01">Prj01</a>
</td>
<td>
<a href="#d1e8">Hinterhuber</a>
</td>
</tr>
<tr>
<td>
<a name="Prj02">Prj02</a>
</td>
<td>
<a href="#d1e20">Obermüller</a>
</td>
</tr>
</table>
<h2>Mitarbeiter</h2>
<table border="1">
<tr>
<td>
<b>Name</b>
</td>
<td>
<b>Projekt</b>
</td>
</tr>
<tr>
<td>Hans
<a name="d1e8">Hinterhuber</a>
</td>
<td>
<a href="#Prj01">Prj01</a>
</td>
</tr>
<tr>
<td>Franz Xaver
<a name="d1e20">Obermüller</a>
</td>
<td>
<a href="#Prj02">Prj02</a>
</td>
</tr>
<tr>
<td>Fritz
<a name="d1e66">Meier</a>
</td>
<td>
<a href="#Prj02">Prj02</a>
</td>
</tr>
</table>
</body>
</html><scene>
<FX>General Road Building noises.</FX>
<speech speaker="Prosser">
Come off it Mr Dent, you can't win
you know. There's no point in lying
down in the path of progress.
</speech>
<speech speaker="Arthur">
I've gone off the idea of progress.
It's overrated
</speech>
</scene>...
<xsl:template match="FX">
<fo:block font-weight="bold">
<xsl:apply-templates/>
</fo:block>
</xsl:template>
<xsl:template match="speech[@speaker='Arthur']">
<fo:block background-color="blue">
<xsl:value-of select="@speaker"/>:
<xsl:apply-templates/>
</fo:block>
</xsl:template>
...