# Tutorial XML
XML ist eine Auszeichnungssprache (Extensible Markup Language) und dient der strukturierten Darstellung von Daten. Wie HTML verwendet XML auch Tags zur Auszeichnung von Elementen. Im Gegensatz zu HTML, beschreiben Tags nicht wie der Inhalt dargestellt werden soll, sondern wie der Inhalt beschrieben werden kann. XML dient dazu, Struktur, Inhalt und Darstellung eines Dokuments stark zu trennen.
Tags sind durch spitze Klammern gekennzeichnet. Unterschieden wird zwischen öffnenden Tabs, z.B. und schließenden Tabs, z.B. . Jedes geöffnete Tab muss auch wieder geschlossen werden.
Da XML wesentlich allgemeiner ist als HTML, ist es möglich weitere Markup Sprachen zu definieren. So lässt sich mit XML, die Markup Sprache HTML definieren.
Ein XML-Dokument kann so aussehen:
```
Der Traum
```
## Aufbau eines XML-Dokuments
Ein XML-Dokument enthält Deklarationen, Elemente, Attribute, Kommentare, Zeichenreferenzen und Verarbeitungsanweisungen. Im Folgenden werden die wichtigsten dargestellt.
- Deklaration
Leitet ein XML-Dokument ein:
``
- xml kennzeichnet das Dokument als XML
- version="1.0" Versionsnr. des verwendeten XML-Standards
- encoding="utf8" Festlegung der Zeichenkodierung
- standalone="yes" gibt es eine externe Auszeichnungsdeklaration?
### XML-Elemente
Die wichtigsten Einheiten, in die sich ein Dokument gliedern lässt, werden Elemente genannt. Das Wurzelelement umschließt alle weiteren Elemente, wodurch sich hierarchisch eine Baumstruktur ergibt. Die Bedeutung der Elemente werden in den Tags beschrieben. (Siehe Vonhoegen(2011), Seite 49.)
- XML-Attribute
Alle Elemente können mit beliebigen Attributen versehen werden, die bestimmte Eigenschaften eines Elements festhalten sollen. Attribute werden nur im Starttag des Elements platziert. Der Attributname darf im selben Element nur einmal vorkommen.
`` ist **nicht** zulässig
Mehrere Attribute und ihre Werte eines Elements werden durch Leerzeichen getrennt.
``
Auch leere Elemente wie `` können Attribute enthalten:
``
Während Elemente andere Elemente enthalten können, dürfen Attribute nicht verschachtelt werden.
### XML-Kommentare
Grundsätzlich lassen sich Kommentare im gesamten Dokument einfügen, außer innerhalb von Deklarationen und Tags. Auch darf kein Kommentar vor der XML-Deklaration stehen. Ein Kommentar beginnt mit ``.
- Zeichenreferenzen
XML bietet bestimmte XML spezifische Zeichen an. Um die Zeichen zwischen Tags dennoch benutzen zu können, ohne dass diese vom XML Prozessor als Markupzeichen interpretiert werden, müssen diese mit bestimmten Zeichenreferenzen ersetzt werden. Hierfür stellt XML fünf Entitäten bereit:
- `&` für das & ( Et-Zeichen )
- `>` für das <( Größer-als-Zeichen )
- `<` für das >( Kleiner-als-Zeichen )
- `"` für das "( Ersatzzeichen für Anführungszeichen )
- `'` für das ' ( Ersatzzeichen für Apostroph )
In DTD-Dokumenten können auch eigene Entitäten deklariert werden. (Entitäten sind spezielle Zeichenfolgen, die von einer Anwendung, die das XML-Dokument bearbeitet, durch einen bestimmten Text ersetzt werden. Entitätsnamen beginnen stets mit dem Symbol '&'' und enden mit ';')
## Anforderungen an ein XML-Dokument
XML-Dokumente müssen *wohlgeformt* sein, d.h. folgende Regeln müssen erfüllt sein:
- Es gibt nur *ein* Wurzelelement (Tag welche alle weiteren Tags umschließt)
```
Der Traum
Thomas Mann
```
- Jedes Element muss einen Start- und einen Endtag besitzen
```
Informationen zum Buch
Thomas Mann
```
**Falsch:**
```
Informationen zum Buch
Thomas Mann
```
- Elemente dürfen geschachtelt sein, sich aber nicht überlappen
**Falsch**
```
Thomas Mann <\beispiel><\autor>
```
**Richtig**
```
Thomas Mann <\autor><\beispiel>
```
- Attributwerte müssen in Anführungszeichen stehen
`<\beispiel>`
- Namensgebung:
Elementnamen beginnen mit `[A-Za-z\:\_]`, "xml" darf nicht im Namensanfang stehen, Namen sind casesensitive: `ungleich <\Beispiel>`
## Namensräume
Aufgrund der freien Namenswahl in XML von Element- und Attributnamen, kann es zu Überschneidungen von Namen mit unterschiedlichen Bedeutungen kommen. Im Hinblick darauf, dass XML-Dokumente von unterschiedlichen Programmen ausgewertet und bearbeitet werden können, führen Mehrdeutigkeiten schnell zu unerwünschten Ergebnissen. Als Beispiel dient der einfache Elementname ``. Dieser kann in verschiedenen Kontexten unterschiedliches meinen. Zwar ist es möglich den Namen zu spezifizieren, wie Buchtitel, Ehrentitel usw., doch könnte dies zu "künstlerischen Bezeichnungen" (Siehe Meuss(2002), Seite 66.) führen oder auch nicht immer so angewandt werden. Namensräume sollen die Eindeutigkeit von Namen gewährleisten, indem die einzelnen Namen als Teile eines bestimmten Gegenstandsbereich behandelt werden. XML-Namensräume werden in der Regel über eine URL identifiziert, um Eindeutigkeit zu gewährleisten - die URL muss nicht auf eine vorhandene Web-Ressource verweisen. Die Deklaration des Namensraums geschieht in der Form eines Elementsattributes. Der Namensraum bezieht sich auf das Element und all seine Kindelemente. Soll der Namensraum für das ganze XML-Dokument gelten, ist der Namensraum in dem Wurzelelement zu definieren.
Beispielsweise kann die Namensraumdefinition im Element so aussehen:
```
... <\buch>
```
- xlns ist der reservierte Attributname für Namensräume
- ttl das selbst gewählte Präfix als Abkürzung für den Namensraum
- http://titel.com/buch der eigentliche Namensraum Das Prefix wird dann dem betroffenen Element oder Attribut zur Eindeutigkeit vorangestellt
```
.. <\ttl:titel>
```
## 4 DTD
Eine XML-Dokumenttyp-Definition(DTD) definiert die Regeln für ein XML-Dokument. Sie definiert welche Elemente (und Attribute) es gibt, und wie diese im Dokument angeordnet werden müssen. Ein XML-Dokument wird gültig genannt, wenn es alle Regeln seiner DTD befolgt.
- Dokumenttyp-Deklaration
Die DTD wird durch eine Dokumenttyp-Deklaration in das XML-Dokument eingebunden. Sie teilt dem Prozessor mit, wo die DTD zu finden ist. Ist die DTD extern, erfolgt die Einbindung über:
```
```
Intern lässt sich die DTD im XML-Dokument selbst definieren als:
```
.. ]>
```
- Elementdeklaration
Elemente werden über eine `` Deklaration eingeführt. In der Deklaration folgt der Name des Elements, wie er auch in der XML Datei vorkommen soll. Dahinter folgt in einem Klammerpaar ein Inhaltsmodell.
Beispiel
```
[...]
```
| Inhaltstyp | Beispiel | Bedeutung |
|-------------------|---------------------------------------|------------------------------------------------------------------------------------------------|
| EMPTY | | ein Element ohne Inhalt, aber evtl. mit Attributen |
| ANY | | beliebiger Inhalt, solange wohl geformtes XML |
| #PCDATA | | Das Element enthält nur Zeichendatan |
| Gemischter Inhalt | | Das Element enthält nur Zeichendaten oder eine Kombination von Zeichendaten und Unterelementen |
| Elementinhalt | | Ein Element enthält nur Unterelemente |
Tabelle 1: Inhaltstype für Elemente
Die Anzahl der (Unter)Elemente können durch Indikatoren +,\*, ? bestimmt werden. z.B. kann das Childelement einmal, keinmal oder mehrmals vorkommen.
- Attributlistendeklaration
Diese Deklaration führt alle Attribute, die in einem gegebenen Element verwendet werden können. Sie wird durch eingeleitet. Nach Angabe des Elements und Attributs, können noch Typ wie auch Standardwert beschrieben werden. Tabelle 2, 3 geben einen Überblick über
mögliche Auszeichnungsmöglichkeiten. (Siehe Vonhoegen(2011), Seite 90- 91)
z.B.
| Attributtyp | Beschreibung |
|-------------|----------------------------------------------------------------------------------|
| CDATA | Einfache Zeichendaten ohne Markupzeichen |
| ENTITY | Name einer in der DTD nicht deklariertennicht geparsten Entität |
| Entities | Durch Leerzeichen getrennte Liste von Entitä-ten |
| ID | Eindeutiger XML-Name, der als Identifizierereines Elements verwendet werden kann |
| IDREF | Verweis auf den ID-Identifizierer eines Ele-ments |
| IDREFS | Liste von Verweisen auf ID Identifizierern |
| NMTokens | Liste von mehreren XML Namen |
| NOTATION | Verweis auf eine Notation z.B. Name für einnicht XML-Format wie Grafikdatei |
Tabelle 2: Attributtypen in DTD
| Vorgabedeklaration | Beschreibung |
|--------------------|------------------------------------------|
| #IMPLIED | Keine Vorgabe |
| #REQUIRED | Kein Vorgabewert, aber Wert erforderlich |
| #FIXED Wert | Weist dem Attribut einen Standardwert zu |
Tabelle 3: Werte für die Vorgabedeklaration
Ein DTD-Dokument hat immer als *.dtd* gespeichert.
```
beispiel.dtd
```
Das eigentliche XML-Dokument bindet die externe DTD *beispiel.dtd* ein:
```
Paul Auster
Die New York-Trilogie
1989
Richard Kelly
Donnie Darko
2001
```
## XML-Schema
DTD ermöglicht die Wohlgeformtheit eines Dokuments zu prüfen, prüft jedoch nicht den Inhalt der verwendeten Tags. Eine andere Möglichkeit Standards für XML- Dokumente einzurichten ist XML-Schema. Hierbei können die geforderten Inhalte von Tags und Attribute genauer angegeben werden, auch ohne auf eine seperate Syntax zugreifen zu müssen.
- Schema-Definition
Die Schema-Definition befindet sich als Wurzelelement in einer .xsd Datei. Die meisten Parser unterstützen ein Schema auch als Alternative zu DTD.
```
```
Ein XML-Schema wird in einem XML-Dokument über folgende Zeile eingebunden:
```
```
- Elementdefinition
Jedes Element wird in einer -Deklaration angegeben. Unterschieden werden einfache und verschachtelte Elemente. Erstere, die nur einfachen Inhalt ohne weitere verschachtelte Elemente und Attribute besitzen, benötigen im Schema das Attribut *type*, das den zulässigen Typ des Inhalts angibt.
Die Syntax einer einfachen Elementdeklaration ist:
```
```
Häufige Datentypen sind:
- xs:string
- xs:integer
- xs:decimal
- xs:boolean
- xs:date
- xs:time
- ...
Beispielsweise geben "xs:string" den Typ für beliebigen Text und "xs:integer" den Typ für ganze Zahlen an .
Auch Attribute werden zu der Klasse der einfachen Elemente gezählt und genauso deklariert:
```
```
Es ist möglich weitere Eigenschaften wie z.B. Defaultwerte und Erforderlichkeit in der Deklaration zum Attribut hinzuzufügen. Einfache Elemente können keine Attribute haben, da sie sonst als verschachtelte Elemente gelten.
Einfache Elemente und Attribute können in ihren Werten auch eingeschränkt werden. Im folgenden Beispiel wird für das Element "Alter" eine Mindest- und eine Höchstgrenze festgelegt. Weitere Beschränkungsmöglichkeiten bildet Tabelle 4
```
```
| Beschränkung | Beschreibung |
|----------------|-------------------------------------------------------------------------------------------------------|
| enumeration | Definiert eine Liste akzeptierter Werte |
| fractionDigits | Definiert die maximale Anzahl erlaubter Dezimalstellen (=> 0) |
| length | Definiert die erlaubte Anzahl von Zeichen oder Listenelemente ( => 0) |
| maxExclusive | Definiert eine obere Grenze nummerischer Werte (der Wert muss unter der Grenze liegen) |
| maxInclusive | Definiert eine obere Grenze nummerischer Werte (der Wert muss kleiner oder gleich der Grenze sein) |
| maxLength | Definiert die maximal erlaubte Anzahl von Zeichen oder Listenelemente |
| minExclusive | Definiert eine untere Grenze für nummerische Werte (der Wert muss über der Grenze liegen) |
| minInclusive | Definiert eine untere Grenze für nummerische Werte (der Wert muss größer oder gleich der Grenze sein) |
| minLength | Definiert die minimal erlaubte Anzahl von Zeichen oder Listenelemente (>=0) |
| pattern | Legt eine exakte Folge von Zeichen fest |
| totalDigits | Legt fest, wie viele Zahlen erlaubt sind (>0) |
| whiteSpace | Legt fest, wie Leerzeichen zu händeln sind |
Tabelle 4: Beschränkungen für Datentypen
Verschachtelte Elemente besitzen ein -Block. In diesem werden alle Elemente und Attribute als einfache Elemente aufgelistet. Besitzt das *Oberelement* selbst ein Attribut, kann die Deklaration gesplittet erfolgen. Zunächst wird das Oberelement wie ein einfaches Element deklariert und mit einer folgenden selbst definierten Typangabe auf seine ihm untergeordneten Elemente verwiesen:
```
```
### Indikatoren
Indikatoren ermöglichen festzulegen wie Elemente verwendet werden dürfen. Zur Auswahl stehen 7 Indikatoren:
**Order indicators**
(geben die Reihenfolge der Elemente vor)
- **All** Alle Elemente im complexType-Block tauchen nur einmal auf
- **Choice** Nur eines der Elemente taucht im Block auf
- **Sequence** Die Elemente müssen in der Reihenfolge wie sie definiert wurden, auftauchen
z.B.
```
```
**Occurrence indicators**
(geben die Anzahl der Elemente an)
- **maxOccurs** legt fest wie oft ein Element maximal vorkommen kann
- **minOccurs** legt fest wie oft ein Element mindestens vorkommen muss
z.B.
```
```
**Group indicators**
(ermöglichen es Elemente zu gruppieren, und später auf eine Gruppe zu referenzieren- es erfordert innerhalb der Gruppe einen *Order*-Indikator)
- **Group name** name der Gruppierung
- **attributeGroup** name
z.B.
```
```
## XSL und XSLT
XSL (Extensible Stylesheet Language) ist ein weiterer zur Verfügung gestellter Standard und besteht aus zwei Komponenten:
- XSL-FO zur Formatierung von XML Daten
- XSLT (XSL Transformation) zur Transformation von XML Daten in andere textbasierte Dateien
Die Hauptanwendung von XSL ist XSLT. Denn XSLT ermöglicht es, XML Daten in HTML umzuwandeln. Dadurch können Daten strukturiert in XML gespeichert und in HTML präsentiert werden.
- Transformation mit XSLT
XML-Elemente sollen in eine andere XML gerechte Sprache transformiert werden. Hierfür sollen Elemente und Attribute in Auszeichnungskonstrukte einer anderen Sprache umgewandelt werden. Aus eigenen XML-Elementen wie z.B. *autor* soll der HTML code *[...] | * werden. Um auf XML-Elemente zugreifen zu können, wird die eigene XSLT-Sprache XPath verwendet. Die Umwandlungsregeln werden in einer XSLT-Datei in XML festgelegt. Die XSL-Datei wird dann im eigentlichen XML-Dokument eingebunden.
**Wichtige Merkmale von XSLT**
- Baumstrukturen als Modelle von XML-Dokumenten
- XSLT Stylesheets definieren die Umwandlung der Eingabebaumstruktur in eine Ausgabebaumstruktur
- Zugriff auf Teile des Eingabebaums mithilfe von Xpath
- Vorlage (Templates) definiert den Ausgabebaum
**Prinzip der Transformation**
1. XML-Dok. wird vom Parser eingelesen, und als Baum interpretiert
2. XSLT-Dok. wird vom Parser eingelesen, und als Baum interpretiert
3. Beide Bäume werden vom XSLT-Prozessor eingelesen
4. Der neue (Ausgabe-)Baum erhält gewünschte serielle Form
Eine Transformation besteht aus einer Reihe von einzelnen Transformationsregeln, die als "Templates" ("Schablonen") bezeichnet werden. Ein Template besitzt ein auf XPath basierendes Pattern ("Muster") das beschreibt, für welche Knoten es gilt, und einen Inhalt, der bestimmt, wie das Template seinen Teil des Zielbaums erzeugt.
- Die Subsprache XPath
Die Sprache XPath lokalisiert Elemente in XML-Dokumenten. Ihre abgekürzte Syntax ähnelt Ausdrücken, die benutzt werden, um in hierarchischen Filesystemen Pfade zu Dateien und Verzeichnissen zu spezifizieren. Der XPath Ausdruck /stadt/hotels//name zeigt auf alle *name*- Elemente, die als Nachfolger von *hotels*-Elementen im Wurzelelement mit Label *stadt* auftreten. In dieser Syntax steht . für die augenblickliche Position in XML-Baum und \.\. für das jeweilige Elternelement. Bei der ausführlichen Syntax wird für jeden Schritt, explizit die Richtung angegeben, in der der Baum durchwandert werden soll. Der obige XPath Ausdruck wird dann als */child::stadt/child::hotels/descendant::name* dargestellt. In beiden syntaktischen Formen kann an jeden Schritt eine Folge von Prädikaten angehängt werden, die die Auswahl einschränken. Der obige Ausdruck lässt sich beispielsweise auf *stadt*-Elemente beschränken, die auch *flughafen*-Unterlemente haben:
/stadt[.//Flughafen]/hotels//name
bzw.
/child::stadt[descendant::Flughafen]/child::hotels/descendant::name
Ein XPath-Ausdruck besteht aus einer Folge von Lokalisierungsschritten, die durch / verknüpft sind. Lokalisierungsschritte, die ohne / eingeleitet werden sind absolute, andernfalls relative Ausdrücke. Ein Lokalisierungsschritt besteht aus der Angabe der Achse, dem Symbol ::, einem Knotentest (Labelname, text() oder node()) und einer optimalen Folge von Prädikaten (ein in []- Klammern auftauchender XPath-Ausdruck). (Siehe Meuss(2001), Seite 28.)
In XPath verwendete Achsen: child, descendant-or-self, ancestor-or-self, preceding, preceding-sibling, following, following-sibling, attribute, namespace.
In XPath-Ausdrücken können eine begrenzte Zahl an Funktionen verwendet werden. Dazu zählen arithmetische Funktionen (Addition, Multiplikation, Vergleiche), Boole'sche Funktionen (and, or, nor), Stringfunktionen (concat) sowie Funktionen, die auf Knotenmengen arbeiten (count, position). Der XPath-Ausdruck
/descendant::chapter[count(descendant::section)>7]
selektiert *chapter*-Elemente, die mehr als sieben *section*-Elemente enthalten.
## Aufbau einer XSLT Datei
Ein XSL-Stylesheet beginnt immer mit einer XML-Deklaration und seiner Stylesheetdefinition als Wurzelelement:
Ein XSLT-Programm ist eine freie Abfolge von Template-Regeln, die jeweils in das Element eingepackt sind. Ein Template besteht aus einem Suchmuster und einer oder mehreren Anweisungen im Template selbst.
Ein Template kann wie folgt aussehen:
```
```
Das *xsl:template*-Element enthält im *match*-Attribut einen XPath-Ausdruck, der die Elemente beschreibt, deren Transformation in dieser Regel beschrieben werden. Im obigen Fall also ein *book*-Element, das ein *price*-Attribut hat. Der Regelrumpf beschreibt wie der gesamte Inhalt des *xsl:template*-Elements des bisher erzeugten Ausgabedokuments ergänzt werden soll. Dies kann statisch, durch direkte Angabe der hinzuzufügenden Elemente, oder dynamisch, durch weitere XSLT-Anweisungen, geschehen. Im obigen Beispiel werden die html-Elemente zunächst statisch erzeugt. (Eine HTML Datei besteht aus einem HTML- Kopf (head) und einem -Körper (body). Wie in XML gibt es öffnende und schließende Tags. Das Wurzelelement ist . Im Abschnitt wird der eigentliche Inhalt zur Webanzeige definiert. Typische Elemente sind `` für Überschriften, `` für Paragraphen usw.) Die Unterelemente *h2* und *body* werden aber dynamisch erzeugt. Der XSLT-Befehl *xsl:value-of* ergänzt das Zieldokument um die Knoten, die durch den XPath-Ausdruck beschrieben werden, der im *select*-Attribut des *xsl:value-of*-Befehls angegeben ist. Bei ** handelt es sich um Anweisungen, die die Template Regeln dann auch ausführt. Durch den Befehl *xsl:apply-templates* werden rekursiv alle Elemente, die vom gerade behandelten Element über im *select*-Attribut angegebenen Pfad erreichbar sind, nach weiteren Regeln gesucht, welche ebenfalls ausgeführt werden. Nach Beendigung, werden alle erzeugten Teildokumente an dieser Stelle eingefügt, also direkt nach dem *h2*-Element. (Siehe Meuss(2002), Seite 34.)
- Von XML zu HTML
Im Folgenden wird ein XML-Dokument in eine HTML Datei umgewandelt. Das *XML-Dokument* sieht wie folgt aus:
```
[DRAFT!] (2009-): Wittgenstein TS 213: Ts-213.xml
Ludwig Wittgenstein
Alois Pichler
Wittgenstein Archives at the University of Bergen (WAB)
das ist der Satz AAA nnn
das ist der Satz BBB nnn Don't forget me
this week-
end
das ist der Satz XAAA nnn
das ist der a+b Satz XBBB nnn Don't forget me
this weekend
```
Das **XSL-Stylesheet** in der Datei *mywitt.xsl* definiert die eigentliche Umwandlung:
```
-
```
Damit das XML-Dokument das Stylesheet anwenden kann, muss es in der XML Datei eingebunden sein. Die **Einbindung** erfolgt im XML-Header über die Anweisung:
```
[DRAFT!] (2009-): Wittgenstein TS 213: Ts-213.
xml
Ludwig Wittgenstein
Alois Pichler
Wittgenstein
Archives at the University of Bergen (WAB)
orgName>
das ist der Satz AAA nnn
satz>
das ist der Satz BBB nnn <
pb facs="Ts-213,45r"/> Don't forget me
this week-
end
das ist der Satz XAAA nnn
das ist der a+b
notation> Satz XBBB nnn Don't forget me
this weekend
```
## Übungen
1. Welcher Unterschied wird zwischen Wohlgeformtheit und Gültigkeit bei XML-Dokumenten gemacht?
2. Wie sieht die DTD *CISWAB.dtd* zu folgendem XML-Dokument aus:
```
[DRAFT!] (2009-): Wittgenstein TS 213: Ts-213.xml
Ludwig Wittgenstein
Alois Pichler
Wittgenstein Archives at the University of Bergen (WAB)
das ist der Satz AAA nnn
das ist der Satz BBB nnn Don't forget me
this week-
end
das ist der Satz XAAA nnn
das ist der a+b Satz XBBB nnn Don't forget me
this weekend
```
3. Ein Vorteil von XML-Schema ist, gültigen Inhalt von XML-Elementen genauer zu definieren. Oftmals haben sichere Passwörter eine mindest- wie auch höchst-Zahl von Stellenangaben. Schreibe die passende Schemadefinition des XML-Elementes , dessen Inhalt mindestens 5 und höchstens 10 Zahlen erwartet.
4. Mittels XSLT lassen sich XML-Dokumente automatisch transformieren. Hierfür wird u.a. die Schleifenfunktion bereitgestellt, die automatisch jedes Element von *select* durchsucht. Zu dem erweiterten Einführungsbeispiel (folgend) soll jetzt ein Stylesheet den XML-Inhalt in HTML als Tabelle darstellen.
```
Der Traum
Stolz und Vorurteil
Jane Austen
```
Autor und Titel sollen dabei in einer Tabelle aufgelistet werden wie folgt
| der Titel | der Autor |
|-------------------|-------------|
| Der Traum | |
| Stolz und Vorteil | Jane Austen |
Vervollständige folgendes Stylesheet:
```
___________ |
__________ |
|
|
__________
___________
```
## Literaturverzeichnis
Helmut Vonhoegen, Einstieg in XML, Bonn 2011, Galileo Computing
Holger Meuss (2002) XML-Anfragesprachen
http://www.cis.uni-muenchen.de/kurse/max/korpunix/scripten/Meuss-Skriptum.pdf (Abgerufen 11.05.2014)