SEKap07 - Informatik

Werbung
7. XML-Suchmaschinen
7.1 Einsatzgebiete für semi-strukturierte Daten
7.2 XML-Anfragesprache XPath
7.3 Preference XPath
7.4 XML-Anfragesprache XQuery
7.5 Transformationssprache XSLT
7.6 Online-Quellen
© Prof. Kießling 2015
7-1

Im Gegensatz zu Volltextsuchmaschinen liegen bei SQL- bzw.
XML-Suchmaschinen strukturierte bzw. semi-strukturierte
Daten vor, da die Daten durch ein Schema beschrieben sind bzw.
beschrieben sein können.

Bei semi-strukturierten Daten ist es möglich, die Suche auf ein
Attribut (attribute search) einzuschränken, anstatt mit einer
Volltextsuche zu arbeiten. Diese Eigenschaft der semi-strukturierten Daten ist ja schon von den strukturierten Daten bekannt:
Perfekte Treffer sind möglich, allerdings auch die leere
Ergebnismenge.

Preference XPath ist die Erweiterung von XPath durch
Präferenzen.
© Prof. Kießling 2015
7-2
7.1 Einsatzgebiete für semi-strukturierte Daten
Beispiel für Anwendungsszenario:
Es soll ein Korpus von Videodateien (z.B. „Olympische Spiele“) existieren.
Eine Folksonomy bzw. Redakteure sichten und annotieren die Datensammlung
mit MPEG-7, wodurch die Videos semantisch erschlossen werden.
Über eine Benutzeroberfläche (Webservice, App) wird Interessenten die
Möglichkeit geboten ihre Ziele, Wünsche, … einzugeben.
Aufgabe der Suchmaschine ist es, die der Benutzer-Spezifikation entsprechenden Videosequenzen auszuliefern.
Eine weitere XML-Sprache SMIL kann Video-Segmente beschreiben und
wird von vielen Browsern unterstützt.
© Prof. Kießling 2015
7-3
Warum werden semi-strukturierte Daten benötigt?
1.) Inhaltliche Erschließung von low-level Datenmengen (z.B. Audio-, Videound Bilddaten), die zwar digital aufgezeichnet und gespeichert sind, deren
Semantik sich jedoch nicht a-priori aus den gespeicherten Daten ergibt.
Eine Möglichkeit besteht darin, eine semantische Interpretation den low-level
Daten in einer formalen Beschreibungssprache zuzuordnen.
Beispiel:
MPEG-7 ist ein Multimedia Content Description Interface. Es beschreibt multimediale Daten durch Metainformationen:
Struktur: Segmente bestehend aus Raum und Zeit
Konzepte: wie Titel, Autor, Agenten, Schlüsselwörter, freie Annotationen,
Speicherort, Laufzeit, Übertragungsrate Medium, Kodierung, …
© Prof. Kießling 2015
7-4
Die Semantik von MPEG-7 wie die anderer XML-Beschreibungssprachen wird
mit einer Datenbeschreibungssprache (Data Definition Language, DDL)
formal festgelegt. Bei XML-Sprachen erfolgt dies durch eine Data Type
Definition (DTD) und immer mehr durch das neuere XML Schema.
Durch eine Beschreibungssprache ergeben sich folgende Vorteile:
 Kontrolliertes Vokabular
 Definierte Semantik
 Kann auf andere Beschreibungssprachen verweisen.
 Kann selbst von anderen Beschreibungssprachen benutzt werden.
 Suche kann nicht nur über Terme, sondern auch über Struktur definiert
werden.
Beispiel:
MPEG-7
© Prof. Kießling 2015
7-5
Weiteres XML-Beispiel:
Gezielter Zugriff auf Videosequenzen durch SMIL als Beschreibungssprache:
<smil>
<head>
<meta name="title" content="video segment"/>
<meta name="author" content="[email protected]"/>
<meta name="copyright" content="©2005"/>
</head>
<body>
<video src="http://137.250.82.189:8080/
P-news/mediaData/Olympics2002_2.rmvb"
clip-begin="1156.03s" clip-end="1434.04s"/>
</body>
</smil>
© Prof. Kießling 2015
7-6
Warum werden semi-strukturierte Daten benötigt?
2.) Datenaustausch / Datenübertragung, Automatisierung, Ecommerce
Viele Daten liegen in strukturierter Form in Applikationen vor und werden
für den Menschen graphisch aufbereitet (z.B. Web-Interface). Vielfach
besteht ein Interesse, die zugrunde liegenden Daten als Input für eine weitere
Verarbeitung mit anderen Applikationen zu verketten.
RSS (Really Simple Syndication) ist eine XML-Beschreibungssprache,
um Inhalte (vor allem aktuelle Kurznachrichten, Blogs, …) übers Web zu
verbreiten.
Beispiel:
RSS Feeds der SZ
© Prof. Kießling 2015
XML
7-7
Beispiele aus Ecommerce: BMECat, eCl@ss
BMEcat als Standard für den elektronischen Austausch von Produktkatalogen
Ziel: Warenverkehr zwischen Unternehmen im Internet zu vereinfachen
(E-Procurement)
Lieferant1
nxm
m+n
Kunde1
Lieferant1
Lieferant2
Kunde2
Lieferant2
Lieferant3
Kunde3
Lieferantn
Kundem
…
…
Herkömmliche Beschaffung
© Prof. Kießling 2015
BMEcat
eCl@ss
…
Lieferant3
…
Lieferantn
E-Procurement
7-8
BMEcat enthält z. B. folgende Beschreibungen für Kataloge:
 Lieferantennummer
 Artikelbeschreibung
– Kurzbeschreibung
– Langbeschreibung
– Interne Herstellernummer
– Herstellername
– Lieferzeit
 Artikelmerkmale
– Name des Merkmalsystems (z.B. eCl@ss)
– Merkmal_1 … (z.B. entsprechend eCl@ss)
 Bestellung
– Bestellmenge
– Preis
– Kundentyp
© Prof. Kießling 2015
7-9
eCl@ss ist ein Merkmalkatalog für die Beschreibung von Produkten.

Das eCl@ss-System besteht aus den drei Komponenten:
– Klassen,
– Merkmalen und
– Werten.

Bei Klassen handelt es um hierarchisch aufgebaute Produktkategorien. Die Unterteilung erfolgt dabei in vier Ebenen, wobei nur in der
untersten, vierten Ebene konkrete Produkte beschrieben werden.

Jede Klassifikation ist durch eine eindeutige, achtstellige Nummer
gekennzeichnet. Die Nummer 21-09-01-01 steht z.B. für Bohrmaschinen.

Die Navigation in den Hierachie-Ebenen erfolgt mit hierachischer
Suche.
© Prof. Kießling 2015
7 - 10
© Prof. Kießling 2015
7 - 11

Nach hierarchischer Suche erscheinen die im Kontext
relevanten Attribute (bei eCl@ss: „Merkmale“). Sie können
z.B. auch für eine Attribut-Suche benutzt werden.

Den Klassen sind Schlagworte zugeordnet, wodurch es
unnötig wird, durch die Hierachie-Ebenen zu navigieren, da
man durch die Schlagwort-Suche die relevanten Klassen
angezeigt bekommt.
© Prof. Kießling 2015
7 - 12
7.2 XML-Anfragesprache: XPath
7.2.1 Überblick

XPath ist eine Query-Sprache für XML-Daten.

XML-Dokumente sind durch einen Baum repräsentiert.

XPath bietet folgende Funktionalitäten:
– Navigation und
– deklarative Abfrage.

XPath ist die Basis aller höheren XML-Abfragesprachen (XQuery, XSLT).

Fast alle SQL-Datenbanken haben eine XML-Schnittstelle.
© Prof. Kießling 2015
7 - 13
<?xml version=”1.0” encoding=”iso-8859-1”?>
<MOZART xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Mozart.xsd">
<WERK>
<KV> KV 1 </KV>
<JAHR> 1761 </JAHR>
<ORT> Salzburg </ORT>
<BESCHREIBUNG> Menuett für Klavier </BESCHREIBUNG>
<TONART> G-Dur </TONART>
</WERK>
<WERK> ............. </WERK>
...
<WERK> ............. </WERK>
</MOZART>
© Prof. Kießling 2015
XML
7 - 14
XPath ermöglicht keinen schreibenden Zugriff, um die Struktur
oder Werte zu ändern.
Document Object Model (DOM) ist eine
Programmierschnittstelle (API) für den Zugriff auf XMLDokumente.
XSL-Transformation (XSLT) ist eine Programmiersprache
zur Transformation von XML-Dokumenten.
XSL steht für Extensible Stylesheet Language Family. XSLT und
XPath gehören zu dieser Familie.
© Prof. Kießling 2015
7 - 15
Es gibt 3 Versionen von XPath:
 Version 1.0 und
 Version 2.0 und Version 3.1 seit Dezember 2014.
Version 2.0 ist eine Obermenge von Version 1.0:
 Umfangreichere Menge von Datentypen (19 statt 4),
 Umfangreichere Menge von Funktionen (z.B. min(…), max(...)),
 Iteratoren (For Expressions),
 Operatoren (Sequence Expressions), um Anfragen zu konstruieren, zu
filtern oder zu kombinieren,
 Verzweigungen (Conditional Expressions) der Art „if-then-else“,
 Existenz- und All-Quantoren (Quantified Expressions).
© Prof. Kießling 2015
7 - 16
Version 3.0 erweitert Version 2.0 um:





Dynamische Funktionsaufrufe,
Inline-Funktionen,
Verbundtyp,
String-Konkatenation,
Mapping-Operator.
Version 3.1 erweitert Version 3.0 um:


Maps,
Arrays.
Im folgenden beschränken wir uns auf die Version 1.0, da bislang nur für diese
Version eine Erweiterung um Präferenzen implementiert worden ist.
© Prof. Kießling 2015
7 - 17
XML-Technologie wie XML-Parser, XPath, … steht in fast allen
Programmiersprachen in Form von Bibliotheken zur Verfügung.
Bereits in früheren Versionen von Java SE (aktuell 8u45) war JAXP
(aktuell 1.6) integriert.
Folgende Funktionalitäten stehen mindestens zur Verfügung:
 Parser für DOM Level 3,
 XML Schema Validierung,
 XML Schema Datentypen,
 XPath.
© Prof. Kießling 2015
7 - 18
7.2.2 Spezifikation einer Treffermenge
Folgende Schritte sind auszuführen:
1.) Festlegung des Kontextknotens „self“ durch Lokalisierungspfad
2.) Ausgehend vom „self“ eine Achse festlegen, wodurch eine Menge K von
Knoten selektiert wird.
3.) Festlegung eines Knotentests auf K, wodurch ein Knotentyp selektiert wird.
4.) Optional kann K weiter eingeschränkt werden, indem weitere Prädikate
festgelegt werden (exact match).
Syntax eines Lokalisierungsschrittes:

<Achse>::<Knotentest>[<optionales Prädikat>]*
© Prof. Kießling 2015
7 - 19
7.2.3 Navigation
Alle Achsen sind immer relativ zum aktuellen Kontextknoten.
• Vater
• Jüngere Geschwister
• Ältere Geschwister
parent axis
KontextKnoten
self axis
following-sibling axis
preceding-sibling axis
© Prof. Kießling 2015
7 - 20
<MOZART xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xsi:noNamespaceSchemaLocation="Mozart.xsd">
<WERK>
<!-- Kontextknoten -->
<KV> KV 1 </KV>
<JAHR> 1761 </JAHR>
<ORT>Salzburg</ORT>
<BESCHREIBUNG>Menuett für K. </BESCHREIBUNG>
<TONART> G-Dur </TONART>
</WERK>
…
<MOZART/>
© Prof. Kießling 2015
7 - 21
∃! Dokumentknoten
• Vorfahren
• Jüngere / ältere
Geschwister der
Vorfahren
preceding axis
∃!
Wurzelknoten
…
ancestor axis
parent axis
following axis
KontextKnoten
self axis
© Prof. Kießling 2015
7 - 22
<MOZART xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xsi:noNamespaceSchemaLocation="Mozart.xsd">
<WERK>
<!-- Kontextknoten-->
<KV> KV 1 </KV>
<JAHR> 1761 </JAHR>
<ORT>Salzburg</ORT>
<BESCHREIBUNG>Menuett für K.</BESCHREIBUNG>
<TONART> G-Dur </TONART>
</WERK>
…
<MOZART/>
© Prof. Kießling 2015
7 - 23
• Kinder
• Nachfahren
KontextKnoten
self axis
child axis
descendant axis
Zusätzlich kann der Kontext-Knoten in der Ergebnisknotenmenge der Nachfahren eingeschlossen sein, falls die Achse „descendant-or-self“ gewählt wird.
Einen analogen Einschluss in die Ergebnismenge der Vorfahren erhält man mit
der Achse „ancestor-or-self“.
© Prof. Kießling 2015
7 - 24
<MOZART xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xsi:noNamespaceSchemaLocation="Mozart.xsd">
<WERK>
<!-- Kontextknoten-->
<KV> KV 1 </KV>
<JAHR> 1761 </JAHR>
<ORT>Salzburg
<Adresse> Madresse </Adresse>
</ORT>
<BESCHREIBUNG> Menuett für K. </BESCHREIBUNG>
<TONART> G-Dur </TONART>
</WERK>
…
<MOZART/>
© Prof. Kießling 2015
7 - 25
Zusätzlich gibt es die weiteren Achsen


attribute axis und
namespace axis,
die es ermöglichen, die Attribute eines Knotens bzw. Knoten, die in
einem Namensraum liegen, zu adressieren.
© Prof. Kießling 2015
7 - 26

Namensraumknoten:
<xmlns:meinNamensraum =
"http://meinWebserver.org/meineNamensraumBeschreibung">
Ein Tag-Name bekommt durch den Kontext eines Namensraumes einen
eindeutigen Namen. Eindeutigkeit wird über die URI gewährleistet. Sie
ist der global gültige Name des Namensraums.
Jedem Elementknoten sind all die Namensräume zugeordnet, in deren
Gültigkeitsbereich der Knoten liegt.
Die Namensräume eines Elementknotens werden mit der Achse und
einem “*“-Test, also namespace::*, ermittelt.
Jeder Elementknoten gehört standardmäßig dem Namensraum xmlns:xml
an, dessen Eindeutigkeit durch die URI
http://www.w3.org/XML/1998/namespace gesichert ist.
© Prof. Kießling 2015
7 - 27
7.2.4 Knotentests
Beispiel für XML-Syntaxbaum:
<MOZART xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Mozart.xsd">
<WERK urteil = "gut">
<?xml-professor lernziel="Baumstruktur mit Knotentypen"?>
<KV> KV 1 </KV>
<JAHR> 1761<!-- oder 1762? --> </JAHR>
<ORT> Salzburg </ORT>
<BESCHREIBUNG> Menuett für Klavier </BESCHREIBUNG>
<TONART> G-Dur </TONART>
</WERK>
</MOZART>
/
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- XML-Datei mit EINEM Werk von Mozart: -->
<?xml-stylesheet href="mystyle.css" type="text/css"?>
c
pi
M
ns
a
W
pi
K
J
c O
B
a
T
G-Dur
© Prof. Kießling 2015
7 - 28
Es gibt folgende Knotentypen und Knotentests:
 Dokumentknoten entspricht “/”.
Er hat keinen Knotentest.
Mögliche Kinder:
ggf. Anweisungs- und Kommentarknoten
genau 1 Elementknoten (Wurzelknoten)

Kommentarknoten: comment()
<!-- Das ist ein Kommentar. -->
© Prof. Kießling 2015
7 - 29

Elementknoten: element()
<elementName> … </elementName>

Textknoten: text()
<titel> Prof. </titel>

Element- oder Textknoten: node()
<elementName1> ... </elementName1>
<elementName2> text </elementName2>
© Prof. Kießling 2015
7 - 30

Attributknoten: attribute()
<prof status = "Ordinarius" kürzel = "DBIS">
Anweisungsknoten: processing-instruction()
<?xml-stylesheet href="mystyle.css" type="text/css"?>
<?xml-professor lernziel="Querysprache XPath"?>
Ein Anweisungsknoten kann von einer Applikation interpretiert werden, um
eine Funktion auszuführen.

Vorsicht:
Die XML-Deklaration <?xml version="1.0"?> ist kein Anweisungsknoten.
© Prof. Kießling 2015
7 - 31
Abkürzung:
.
..
//
Langform:
self::node()
der aktuelle Knoten (Kontextknoten)
parent::node()
der Elternknoten des aktuellen Knotens
descendant-or-self::node()
Alle Knoten, deren Wurzel der aktuelle Knoten ist.
Beachte: Der Knotentest node() lässt nur Element- und
Textknoten in der Ergebnismenge zu!
© Prof. Kießling 2015
7 - 32
Abkürzung:
name
*
@name
@*
Langform:
child::name
alle Kinderknoten vom Typ “element” mit dem Namen
“name”
child::element()
alle Kinderknoten vom Typ “element”
attribute::name
Attribut mit Namen “name” des aktuellen Knotens
attribute::attribute()
alle Attribute des aktuellen Knotens
Die Default-Achse ist „child“.
© Prof. Kießling 2015
7 - 33
Beispiel für (verkürzten) XML-Syntaxbaum:
<MOZART xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Mozart.xsd">
<WERK urteil = "gut">
<?xml-professor lernziel="Baumstruktur mit Knotentypen"?>
<KV> KV 1 </KV>
<JAHR> 1761<!-- oder 1762? --> </JAHR>
<ORT> Salzburg </ORT>
<BESCHREIBUNG> Menuett für Klavier </BESCHREIBUNG>
<TONART> G-Dur </TONART>
</WERK>
</MOZART>
/
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- XML-Datei mit EINEM Werk von Mozart: -->
<?xml-stylesheet href="mystyle.css" type="text/css"?>
c
pi
M
ns
a
pi
K
c J
W
O
B
a
T
G-Dur
© Prof. Kießling 2015
7 - 34
Beispiele für Navigation und Knotentests:
/
/* ebenso /MOZART
/MOZART/* ebenso /MOZART/WERK
/MOZART/WERK/@*
/MOZART/namespace::*
/MOZART/WERK/processing-instruction()
/MOZART/WERK/*
/MOZART/WERK/JAHR
/MOZART/WERK/JAHR/text()
/MOZART/WERK/JAHR/comment()
//JAHR/comment()
© Prof. Kießling 2015
/
M
W
a
ns
pi
K
J
O
B
T
1741
c
7 - 35
7.2.5 Prädikate
Prädikate stehen zwischen eckigen Klammern. Die bislang durch Achse
und Knotentest bestimmte Knotenmenge K wird durch Prädikate weiter
eingeschränkt (exact match).
Beispiele:
 Reihenfolge [1 … position( ) = n … last( )]
Statt [position()=n] kann verkürzt [n] geschrieben werden.
/MOZART/WERK [5]
/MOZART/WERK [last( )]
/MOZART/WERK [last( ) - 1]
 Arithmetische Vergleiche
/MOZART/WERK [position( ) < 3]
/MOZART/WERK [JAHR > 1762]
© Prof. Kießling 2015
7 - 36
Prädikate können auch analog zur WHERE-Klausel von SQL für die
Filterung der zurückgelieferten Knotenmenge durch Einschränkung des
Inhalts von Tags (Textknoten) benutzt werden.
Beispiele:

Arithmetische Vergleiche
/MOZART/WERK [JAHR > 1762]
/MOZART/WERK [ORT = 'München']
© Prof. Kießling 2015
7 - 37
XPath 1.0 hat auch vordefinierte Aggregatsfunktionen:
 number count (node-set)
 number sum (node-set)
Nur in XPath 2.0:
 number avg (node-set)
 number max (node-set)
 number min (node-set)
Beispiele:
count (/MOZART/WERK [JAHR > 1762])
sum (/MOZART/WERK/JAHR)
© Prof. Kießling 2015
7 - 38
Stringfunktionen:
 boolean contains(string, string)
 string concat(string, string, ...)
 boolean starts-with(string, string)
Weitere Stringfunktionen im Beispiel:
 substring-before("1999/04/01", "/")
 substring-after("1999/04/01", "/")
 substring("12345", 2, 3)
 "1999"
 "04/01"
 "234"
Beispiele:
/MOZART/WERK [contains (TONART, 'Dur')]
/MOZART/WERK [contains (TONART, 'Dur')]
[contains (BESCHREIBUNG, 'Andante')]
© Prof. Kießling 2015
7 - 39
Mengenoperator:
Für die Vereinigung zweier Knotenmengen K 1 ∪K2: „|“
Beispiel:
/MOZART/WERK [JAHR < 1775] | /MOZART/WERK [TONART = 'As-Dur']
Boolesche Operatoren: „and“ und „or“
Beispiele:
/MOZART/WERK [ORT = 'München' or ORT = 'Mannheim']
/MOZART/WERK [ORT = 'München' and ORT = 'Mannheim']
/MOZART/WERK [(ORT = 'München' or ORT = 'Mannheim') and
TONART != 'C-Dur']
© Prof. Kießling 2015
7 - 40
Elementare Arithmethik: + - * div mod
(Unsinniges) Beispiel:
/MOZART/WERK [((JAHR - min(/MOZART/WERK/JAHR))
mod 12) > 10]
/MOZART/WERK [position() mod 2 = 0]
Vergleichsoperatoren: = != > >= < <=
Beispiele:
/MOZART/WERK [TONART != 'C-Dur']
/MOZART/WERK [JAHR = 1761]
/MOZART/WERK [JAHR >= 1767 and JAHR <= 1777]
© Prof. Kießling 2015
7 - 41
7.2.6 Ergebnisprojektion
Die Ergebnisse sind Elemente der Knotenmenge, die im letzten Lokalisierungsschritt adressiert werden.
Beispiele:
/MOZART/WERK [JAHR = 1761]
 Menge von Mozarts Werken des Jahres 1761
/MOZART/WERK [JAHR = 1761] /KV
 Menge von IDs (genannt Köchel-Verzeichnisnummern) von Mozarts
Werken aus dem Jahr 1761
/MOZART/WERK [position() < 180] /KV [contains (. ,'11')]
 Menge der IDs von Mozarts Werken, die vor der Position 180 der
Werke liegen, und deren Köchel-Verzeichnisnummer den String '11'
enthält.
© Prof. Kießling 2015
7 - 42
7.3 Preference XPath
Eigenschaften:
 Präferenzanfragesprache für XML-Datenbestände,
 Erweiterung von Standard-XPath 1.0 um Präferenzen
 Syntax: Um eine harte Selektion anzuzeigen, benutzt XPath [ … ],
für weiche Selektionen (z.B. Präferenzen) benutzen wir #[ … ]#.
Beispiel:
/CARS/CAR #[ ( (@fuel_economy) highest and (@mileage) lowest )
prior to
( (@color) in ("black", "white") and
(@price) around 10000 ) ]#
© Prof. Kießling 2015
7 - 43
Aufbau einer Anfrage in Preference XPath:
/…/…/…
Navigation
(
[…]
Optional harte
Bedingungen
|
#[ … ]#
Optional weiche
Bedingungen
)*
/…
Projektion
Die Abarbeitung der Bedingungen erfolgt von links nach rechts.
Hinweis:
Preference XPath benutzt nur triviale SV-Semantik!
© Prof. Kießling 2015
7 - 44
POS-Präferenz:
 Am liebsten alle Werke von Mozart, die in München komponiert
wurden:
/MOZART/WERK #[ORT is 'München']#
 Am liebsten alle Werke von Mozart, die in München oder auch in
Mannheim komponiert wurden:
/MOZART/WERK #[ORT in ('München', 'Mannheim')]#
© Prof. Kießling 2015
7 - 45
NEG-Präferenz:
 Am liebsten alle Werke von Mozart, die nicht in C-Dur geschrieben
wurden:
/MOZART/WERK #[TONART isnt 'C-Dur']#
 Am liebsten alle Werke von Mozart, die nicht in C-Dur oder G-Dur
verfasst wurden:
/MOZART/WERK #[TONART not in ('C-Dur', 'G-Dur')]#
© Prof. Kießling 2015
7 - 46
POS/NEG-Präferenz:
 Am liebsten alle Werke von Mozart aus München oder Mannheim,
am wenigsten jedoch sind seine Werke aus Verona passend:
/MOZART/WERK #[ORT in ('München', 'Mannheim') not in ('Verona')]#
© Prof. Kießling 2015
7 - 47
POS/POS-Präferenz:
 Am liebsten alle Mozart-Werke aus Verona, aber auch Werke aus
Wien oder aus Salzburg passen noch:
/MOZART/WERK #[ORT in ('Verona') else ('Wien', 'Salzburg')]#
© Prof. Kießling 2015
7 - 48
EXPLICIT-Präferenz:
 Der Benutzer gibt explizit seine Vorlieben bezüglich der
Tonarten an:
Beispiel:
 H-Moll
 C-Dur
 G-Moll
H-Moll
lieber als C-Dur
lieber als B-Dur
lieber als B-Dur
G-Moll
C-Dur
B-Dur
/MOZART/WERK #[TONART explicit
('C-Dur' < 'H-Moll', 'B-Dur' < 'C-DUR', 'B-Dur' < 'G-Moll')]#
© Prof. Kießling 2015
7 - 49
LOWEST-Präferenz
 Am liebsten die Jugendwerke von Mozart, die möglichst früh
geschrieben wurden:
/MOZART/WERK #[JAHR lowest]#
HIGHEST-Präferenz
 Am liebsten das reife Spätwerk von Mozart:
/MOZART/WERK #[JAHR highest]#
© Prof. Kießling 2015
7 - 50
AROUND-Präferenz:
Am liebsten alle Werke von Mozart, die etwa um das Jahr 1763
entstanden sind:
/MOZART/WERK #[JAHR around 1763]#
BETWEEN-Präferenz:
Am liebsten alle Mozart-Werke, die in etwa zwischen 1770 und
1780 entstanden sind:
/MOZART/WERK #[JAHR between 1770, 1780]#
© Prof. Kießling 2015
7 - 51
Partitionierung durch d-Parameter:
Möglichst die Werke aus dem Jahr 1763, wobei ein Unterschied von
zwei Jahren ohne Bedeutung ist:
/MOZART/WERK #[JAHR around 1763, 2]#
© Prof. Kießling 2015
7 - 52
Supremum / Infimum bei Extremal-Präferenzen mit
d-Parameter:
 Möglichst frühe Werke des Komponisten, wobei zwei Jahre keine
Rolle spielen. Infimum sei 1760:
/MOZART/WERK #[JAHR lowest 1760, 2]#
 Möglichst späte Werke des Komponisten, wobei zwei Jahre egal
sind. Supremum sei 1792:
/MOZART/WERK #[JAHR highest 1792, 2]#
© Prof. Kießling 2015
7 - 53
Pareto-Präferenz:
 Am liebsten alle Werke von Mozart, die aus einem möglichst frühen
Schaffensjahr stammen und zudem am liebsten in B-Dur geschrieben
sind.
/MOZART/WERK #[JAHR lowest and TONART is 'B-Dur']#
© Prof. Kießling 2015
7 - 54
Priorisierungspräferenz:
Am liebsten alle Werke von Mozart, die in erster Linie in B-Dur geschrieben, in zweiter Linie in München komponiert und dann
möglichst auch noch Frühwerke sein sollten.
/MOZART/WERK #[ (TONART is 'B-Dur' prior to ORT is 'München')
prior to JAHR lowest ]#
© Prof. Kießling 2015
7 - 55
Komplexe Beispiele:
Am liebsten alle Werke von Mozart, die mit gleicher Wichtigkeit in FDur geschrieben und in München entstanden bzw. Frühwerke sein sollen,
wobei der Entstehungsort wichtiger als das Entstehungsjahr sein soll.
/MOZART/WERK #[TONART is 'F-Dur' and
(ORT is 'München' prior to JAHR lowest) ]#
© Prof. Kießling 2015
7 - 56
Am liebsten alle Werke von Mozart, die in einer Moll-Tonart geschrieben
sein müssen. Zudem sollten die Werke sowohl möglichst genau um das
Jahr 1763 geschrieben, als auch möglichst in Wien entstanden sein. Bei
den Jahren ist ein Unterschied von zwei Jahren ohne Bedeutung. Um
nicht zu viele Ergebnisse zu bekommen, werden die Werke vorsichtshalber auf Messen beschränkt.
/MOZART/WERK
[contains (TONART, 'Moll')]
#[JAHR around 1763, 2 and ORT is 'Wien']#
[contains (BESCHREIBUNG, 'Messe')]
© Prof. Kießling 2015
7 - 57
Zusammenfassung:
Preference XPath stellt eine wesentliche Erweiterung von XPath dar:

Unterstützt „harte Abfragen“ wie XPath.

Unterstützt zusätzlich „weiche Abfragen“.
Preference XPath bietet dem Benutzer vor allem dann einen Vorteil,
wenn es keine perfekten Treffer gibt. Denn dann greift der intelligente
Selektionsmechanismus von Preference XPath (nach dem BMO-Modell).
Ermöglicht die intuitive und detaillierte Angabe und Modellierung von
Präferenzen auf XML-Datenbeständen.


© Prof. Kießling 2015
7 - 58
7.4 XML-Anfragesprache XQuery
XQuery 1.0 hat folgende Eigenschaften:

Ist „die“ Abfragesprache für XML-Daten analog zu SQL bei relationalen DBs.
XQuery-Anfragen werden unter *.xq gespeichert. XQuery ist auch Teil von
SQL/XML.

Basiert auf XPath 2.0.

Ist vom W3C als Recommendation (XQuery 1.0) normiert wie auch das neuste
XQuery 3.1. Version 3.x ist syntaktisch SQL-ähnlicher (Erweiterung um GROUP
BY).

Stellt Funktionalität zur
– Filterung,
– Verknüpfung,
– Transformation und
– Konstruktion
neuer (XML)-Dokumente als Ausgabe zur Verfügung.
© Prof. Kießling 2015
7 - 59
Atomare Datentypen in Textknoten:

Alle einfachen Datentypen, die in XML Schema definiert sind.
Beispiel:
xs:double(5) <!-- xs: ist der NameSpace von XML Schema-->
Typumwandlung:
Mit dem Operator 'cast as' können einfache Typen gewandelt werden.
Beispiel:
‘‘4711‘‘ cast as xs:integer
© Prof. Kießling 2015
7 - 60
Komplexe Datentypen in Textknoten:
Listentyp:
eine endliche, ggf. auch leere Liste von einfachen Datentypen

Beispiel:
<!-- Definition eines einfachen Typs -->
<simpleType name = 'sizes'>
<list itemType = 'decimal'/>
<!-- Liste vom atomaren Typ: decimal -->
</simpleType>
<!-- Listenelemente einer Typinstanz sind durch Leerraum getrennt. -->
<!-- xsi: Namespace für XML Schema Instance -->
<cerealSizes xsi:type = 'sizes'> 8 10.5 12 </cerealSizes>
<!-- Separator: Leerzeichen -->
© Prof. Kießling 2015
7 - 61
Elementknoten:
Direkter Elementkonstruktor mit konstantem Inhalt:
<STUDENT ID = ‘‘007‘‘> James Bond
<MATNR> 9 </MATNR>
<VATER> Hansi Klein </VATER>
</STUDENT>

Berechneter Elementkonstruktor:
element STUDENT { attribute ID {‘‘007‘‘},
text {‘‘James Bond‘‘},
element MATNR {100 mod 13},
<VATER> Hansi Klein </VATER> }
Wobei mit { … } geklammerte Ausdrücke von XQuery evaluiert werden. Die
Schlüsselwörter element, text bzw. attribute erzeugen typspezifische Knoten.

© Prof. Kießling 2015
7 - 62
FLWOR-Ausdrücke
dienen der Transformation / Erzeugung von (XML)-Dokumenten und stehen
für folgende Grundstruktur:
FLWOR:
for $var at $posvar in <Expr>, ...
let $letvar := <Expr>, ...
where <BoolExpr>
order by <Expr>
return <Expr>
SQL:
SELECT
FROM
WHERE
ORDER BY
<selection>
<table_references>
<hard_conditions>
<attribute_list>
<Expr> steht für beliebige XQuery-Ausdrücke. Während SQL Tupel
zurückliefert, wird mit return <Expr> ein (XML)-Dokument konstruiert.
In XQuery beginnen Variablen mit ‘$‘ wie z.B. ‘$var‘. Die Variable $posvar
entspricht dem XPath-Prädikat [position(i)] und läuft von 1 bis last().
© Prof. Kießling 2015
7 - 63
for/let-Klausel
bindet Variablen mit den Ergebnissen von XPath-Ausdrücken:
for bindet das Ergebnis der Evaluierung einer XQuery-Expression elementweise analog zu
Iteratoren an die for-Variable.
let bindet eine vollständige Sequenz (k1, … , kn) von typisierten Knoten an die let-Variable.
Beispiel (let):
Erstellung einer puren Tag-Hierarchie ohne Inhalt der Form:
<MOZART>
<KV/>
<JAHR/>
<ORT/>)
<BESCHREIBUNG/>
<TONART/>)
</MOZART>
© Prof. Kießling 2015
7 - 64
xquery version "1.0";
<!-- Zwei Variablen mit Sequenzen binden -->
let $werk1 := (<KV/>, <JAHR/>, <ORT/>),
$werk2 := (<BESCHREIBUNG/>, <TONART/>)
return
<MOZART>
<!-- Evaluierung { … } der Komposition “,“ zweier XQuery-Variablen -->
{$werk1, $werk2}
Ergebnis:
</MOZART>
© Prof. Kießling 2015
7 - 65
Beispiel (for):



In der Reihenfolge, wie Mozarts Werke in der XML-Datei gespeichert sind, wird mit Hilfe
des laufenden Index auf der Ebene der Werke durch den Datenbestand gegangen.
Der laufende Index wird als Textknoten des Elementknoten „NR“ gespeichert.
Der bereits existierende Elementknoten „WERK“ wird als Kindknoten dem neuen
Elementknoten „NR“ zugeordnet.
Input:
<MOZART>
<WERK>
<KV> … </KV>
Output:
<MOZART_LFD_NR>
<NR> 1
<WERK> …
…
</WERK>
…
</MOZART>
© Prof. Kießling 2015
</WERK>
</NR>
...
</MOZART_LFD_NR>
7 - 66
xquery version "1.0";
<MOZART_LFD_NR xmlns:xsi= "
http://www.w3.org/2001/XMLSchema-instance">
<!-- fn: Namespace zu XPath 2.0 functions -->
<!-- URI unter http://www.w3.org/2005/xpath-functions -->
{ for $werk at $position in fn:doc("WerkMozart.xml")//WERK
return
<NR> {$position, $werk} </NR>
}
</MOZART_LFD_NR>
Mit dem Schlüsselwort at bekommt man den Index der selektierten
Knotenmenge. Mit dem Schlüsselwort in wird ein Dokumentknoten bestimmt.
© Prof. Kießling 2015
7 - 67
Ergebnis:
© Prof. Kießling 2015
7 - 68
Weiteres Beispiel:
Mit Hilfe der Konstruktoren element KV { … }, attribute ID { … } und
{ … } wird eine XML-Struktur angelegt.
Die zu den Tags passenden Werte werden aus dem Original-XML-Dokument
übernommen.
Es entsteht eine durchlaufend nummerierte Liste mit KVs:
<MOZART>
<MOZARTKV>
<WERK>
<KV> … </KV>
…
</WERK>
…
</MOZART>
© Prof. Kießling 2015
text
<KV ID = “1“> KV 1 </KV>
…
</MOZARTKV>
7 - 69
xquery version "1.0";
<MOZARTKV xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
{ for $kv at $position in fn:doc("WerkMozart.xml")//KV
return
element KV {
attribute ID {$position}, text {$kv}
}
}
</MOZARTKV>
© Prof. Kießling 2015
7 - 70
Ergebnis:
© Prof. Kießling 2015
7 - 71
where-Klausel
dient der Filterung, indem die where-Klausel 'true' bzw. 'false' zurückliefert. Auf
gebundene Variablen kann zugegriffen werden.
Beispiel (where):
xquery version "1.0";
<MOZARTKV xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
{ for $kv at $position in fn:doc("WerkMozart.xml")//KV
where fn:concat($kv/../JAHR, "-01-01") cast as xs:date > xs:date("1765-01-01")
return
element JAHR{
attribute ID {$position}, text {$kv/../JAHR}
}
}
</MOZARTKV>
© Prof. Kießling 2015
7 - 72
Ergebnis:
© Prof. Kießling 2015
7 - 73
Joins in XQuery
wie in SQL können Joins formuliert werden. Dabei können auch mehrere XMLDokumente miteinander in Bezug gesetzt werden.
Beispiel (Join):
Zusätzlich zu Mozarts Werk (WerkMozart.xml) soll ein weiterer XML-Datenbestand (LandMozart.xml) existieren, der Orte Ländern zuordnet.
Es kann somit ein XML-Dokument erstellt werden, das für alle Werke statt
Orten das Entstehungsland nennt.
Mit diesem Datensatz könnten weitere länderspezifische Auswertungen
gemacht werden.
© Prof. Kießling 2015
7 - 74
Input: WerkMozart.xml
LandMozart.xml
<MOZART>
<MOZARTLAND>
<WERK>
<LAND> Österreich
<ORT> … </ORT>
…
</WERK>
…
</MOZART>
© Prof. Kießling 2015
<ORT Anzahl = “...“> ... </ORT>
...
</LAND>
…
</MOZARTLAND>
7 - 75
Output:
<MOZARTLÄNDER>
<WERK>
…
<LAND> … </LAND>
…
</WERK>
…
</MOZARTLÄNDER>
© Prof. Kießling 2015
7 - 76
xquery version "1.0";
<MOZARTLÄNDER xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
{ for $werk_ort in fn:doc("WerkMozart.xml")//ORT,
$land_ort in fn:doc("LandMozart.xml")//ORT
where $werk_ort = $land_ort
return
<WERK>
{$werk_ort/../KV, $werk_ort/../JAHR}
<LAND> {$land_ort/../text()} </LAND>
{$werk_ort/../BESCHREIBUNG}
{$werk_ort/../TONART}
</WERK>
}
</MOZARTLÄNDER>
© Prof. Kießling 2015
7 - 77
Ergebnis:
© Prof. Kießling 2015
7 - 78
order by-Klausel
dient der Sortierung. Default ist aufsteigend (ascending). Mit empty least bzw.
empty greatest können leere Elemente, z.B. </TAG>, als kleinste bzw. größte
Elemente ausgegeben werden.
Beispiel (order by):
Es soll eine KV-Liste erstellt werden, durch die alle Werke, die bezüglich des
Stichdatums 01.01.1765 jünger sind, erfasst werden.
Die Ausgabe soll absteigend sortiert sein nach dem Entstehungsjahr und danach
aufsteigend nach dem Entstehungsort.
© Prof. Kießling 2015
7 - 79
xquery version "1.0";
<MOZART_ORDERED_KV
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
{ for $kv at $position in fn:doc("WerkMozart.xml")//KV
where fn:concat($kv/../JAHR,"-01-01") cast as xs:date >
xs:date("1765-01-01")
order by $kv/../JAHR descending, $kv/../ORT
return
element KV {attribute ID {$position}, text {$kv/text()},
$kv/../JAHR, $kv/../ORT}
}
</MOZART_ORDERED_KV>
© Prof. Kießling 2015
7 - 80
Ergebnis:
© Prof. Kießling 2015
7 - 81
Aggregation und Gruppierung
XQuery 1.0 and Xpath 2.0 Functions and Operators stellt auch
Funktionen für Gruppierung und Aggregation auf Sequenzen zur
Verfügung (XQuery 3.0 ist SQL syntaktisch näher!):
Aggregationsfunktionen
 fn:count()
 fn:avg()
 fn:min()
 fn:max()
 fn:sum()
Gruppierung nach Wertegleichheit
 fn:distinct-values()
© Prof. Kießling 2015
7 - 82
Beispiel (Aggregatfunktion):
●
●
Es soll eine Aufstellung erstellt werden, an welchen Orten Mozart wie viele
Werke geschrieben hat.
Diese Aufgabenstellung entspricht in SQL der Gruppierung nach dem
Attribut „Ort“ in Verbindung mit der Aggregatsfunktion „count()“.
© Prof. Kießling 2015
7 - 83
xquery version "1.0";
<KV_PRO_ORT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
{ for $ort in fn:distinct-values (fn:doc("WerkMozart.xml")//ORT)
let $kv := //KV[../ORT = $ort]
return
element WERKE {
<ORT> {$ort} </ORT>,
<ANZAHL> {fn:count($kv)} </ANZAHL>
}
}
</KV_PRO_ORT>
© Prof. Kießling 2015
7 - 84
Ergebnis:
© Prof. Kießling 2015
7 - 85
Aggregation und Gruppierung (ab XQuery 3.0) mittels
GROUP BY und Use Cases
xquery version "3.1";
<GROUP_BY_ORT xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
{
for $werk in fn:doc("WerkMozart.xml")//WERK
group by $ort := $werk/ORT
return
element WERK {
<ORT Anzahl=“{fn:count($werk)}“>{$ort}</ORT>
}
}
</GROUP_BY_ORT>
© Prof. Kießling 2015
7 - 86
FLWOR-Ausdrücke (XQuery 3.1):
FLWOR:
SQL:
for $var at $posvar in <Expr>, ...
SELECT
FROM
WHERE
GROUP BY
ORDER BY
let $letvar := <Expr>, ...
where
<BoolExpr>
group by <Expr>
<selection>
<table_references>
<hard_conditions>
<attribute_list>
<attribute_list>
order by <Expr>
return
<Expr>
© Prof. Kießling 2015
7 - 87
Result-Klausel
dient der Generierung des XML-Dokuments, das die Ergebnisse
beinhaltet.
Weitere FLWOR-Ausdrücke können in der Result-Klausel benutzt
werden.
Beispiel:
●
Es soll eine Aufstellung gemacht werden, an welchen Orten
Mozart wie viele Werke geschrieben hat.
●
Zusätzlich soll die Ausgabe (aufsteigend) sortiert sein nach den
Orten.
© Prof. Kießling 2015
7 - 88
xquery version "1.0";
<KV_PRO_ORT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
{ for $ort in fn:distinct-values (fn:doc("WerkMozart.xml")//ORT)
order by $ort
return
<WERKE>
<ORT> {$ort} </ORT>
{
let $orte := //ORT[. = $ort]
return <ANZAHL> {fn:count($orte)} </ANZAHL>
}
</WERKE>
}
</ KV_PRO_ORT>
© Prof. Kießling 2015
7 - 89
Ergebnis:
© Prof. Kießling 2015
7 - 90
Aggregation und Gruppierung (ab Xquery 3.0) mittels
GROUP BY mit HAVING-Klausel
xquery version "3.1";
<GROUP_BY_ORT xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
{
for $werk in fn:doc("WerkMozart.xml")//WERK
group by $ort := $werk/ORT
return
element WERK {
<ORT Anzahl=“{fn:count($werk)}“>{$ort}</ORT>
}/ORT[@Anzahl > 100]
}
</GROUP_BY_ORT>
© Prof. Kießling 2015
7 - 91
Demos:
1) XPath mit XMLSpy
2) Preference XPath mit DBIS-Eigenentwicklung
3) XQuery mit XMLSpy
© Prof. Kießling 2015
7 - 92
7.5 Transformationssprache XSLT
XSL-Transformation (XSLT) ist eine funktionale, berechnungsvollständige
Programmiersprache zur Transformation von XML-Dokumenten.
Die neuste Version 3.0 unterstützt Streams und die Serialisierung der
Transformationsergebnisse. Sie baut auf XPath 3.0 als Komponente auf.
(1) Globale Funktionen

Funktionsdefinition auf globaler Ebene:
<xsl:function name = “nameSpace:fname“ as = “returnType“>
<xsl:param name = “p1“ as = “p1Type“>
...

Funktionsaufruf:
… nameSpace:fname(parameter1) ...
© Prof. Kießling 2015
<!-- akt. Parameter -->
7 - 93
Beispiel: Konversion einer natürlichen Zahl zu einer römische Ziffer
Definition:
<!-- Funktionsname namespace:name; Typ der Rückgabe -->
<xsl:function name="num:roman" as="xs:string">
<!-- Formaler Parameter und sein Typ -->
<xsl:param name="value" as="xs:integer"/>
<!-- Programmzeile mit formalen Parameter -->
<!-- typspezifische Konvertierung -->
<xsl:number value="$value" format="i"/>
</xsl:function>
Aufruf:
<xsl:value-of select="num:roman(7)“> ==> “VII“
© Prof. Kießling 2015
7 - 94
(2) Mustergetriebene Funktionen (Templates)
Funktionsdefinition:
<xsl:template [match=“pattern“] [name=“qname“] …>
 Funktionsaufrufe:
<xsl:apply-templates [select=“pattern“] …>
<xsl:call-template name=“qname“ …>
●
Parameterübergabe bei benamten Templates:
formaler Parameter: <xsl:param …>
aktueller Parameter: <xsl:with-param …>
Mustergetriebene Funktionen werden ebenfalls global definiert. Ihr
Gebrauch wird durch eine Matching-Bedingung getriggert, wobei die
Struktur des XML-Dokuments ins Spiel kommt.

© Prof. Kießling 2015
7 - 95
Beispiel:
<!-- Definition eines unbenamten Templates, dessen Matching-Bedingung der
Startknoten des XML-Dokuments ist, also: XSLT-Programmstartpunkt -->
<xsl:template match="/">
<!-- rekursiver Abstieg: wende ALLE Templates an, wenn MatchingBedingung zutrifft -->
<xsl:apply-templates/>
</xsl:template>
<!-- nur anwendbar auf MOZART-Knoten -->
<xsl:template match="MOZART">
<!-- wende nur Templates an, die auf WERK-Knoten anwendbar sind -->
<xsl:apply-templates select="WERK"/> <!-- Kindknoten von M. -->
</xsl:template>
© Prof. Kießling 2015
7 - 96
Beispiel:
<!-- Definition eines benamten Templates -->
<xsl:template name="numbered-block">
<xsl:param name="format"> 1. </xsl:param>
<!-- Formaler Parameter mit Defaultwert -->
<fo:block>
<!-- Formatting Objects -->
<xsl:number format="{$format}"/>
<xsl:apply-templates/>
<!-- weitere Templates -->
</fo:block>
</xsl:template>
<!-- http://wiki.selfhtml.org/wiki/Ol: nummerierte Liste -->
<xsl:template match="//ol/li">
<xsl:call-template name="numbered-block">
<xsl:with-param name="format"> a. </xsl:with-param>
<!-- Aktueller Parameter -->
</xsl:call-template>
</xsl:template>
© Prof. Kießling 2015
7 - 97
(3) Weitere Sprachbestandteile:

Kontrollanweisungen
IF-Blöcke:
<xsl:if …>,
Schleifen:
<xsl:for-each … >, …

Lokale Variablen: <xsl:variable ...>
Zahlen, einfache Arithmetik
Strings, Stringfunktionen
XPath für Adressierung der Knoten im XML-Baum:
<xsl:value-of select="XPath-Expression"/>
...




© Prof. Kießling 2015
7 - 98
Folgende beide Anwendungen sind von Bedeutung:

Veränderung von XML-Bäumen
XPath hat nur lesenden Zugriff. XSLT ergänzt dies, indem ein neuer
XML-Baum durch eine Transformation generiert werden kann.

Einbettung von Nutzdaten in Beschreibungssprache
Die graphischen Elemente der Präsentationsebene werden z.B. durch
(X)HTML beschrieben, während die Nutzdaten für die Oberfläche in
XML beschrieben und gespeichert sind und ggf. dynamisch von der
Persistenzschicht zur Verfügung gestellt werden.
© Prof. Kießling 2015
7 - 99
Ein offenes Framework für die Transformation
 XML  (X)HTML
liefert z.B. Cocoon - ein XML-Publishing-System.
Mit Hilfe der graphischen Beschreibungssprache Formating Objects (XSL-FO),
die bereits in XSLT 1.0 definiert ist, können auch andere Formate wie z.B.
PDF aus den XML-Nutzdaten durch einen FO-Prozessor generiert werden.
© Prof. Kießling 2015
7 - 100
Grundstruktur für Verwendung von XSLT

Statische GUI-Komponenten des Zieldokuments werden in einem
Ausgabeformat (z.B. XHTML) beschrieben.

Dynamische GUI-Komponenten werden dynamisch zur Laufzeit
durch XSLT per <xsl:value-of select="XPath-Expression"/> an
den spezifizierten Stellen im Ausgabe-Formular gebunden.

Die Werte stammen aus einem Modell, das in einem XML-Format als
Quelldokument kodiert ist. XPath wird für die Adressierung benutzt.

Dieses (ggf. temporäre) XML-Modell kann seinerseits erst zur
Laufzeit durch eine Anfrage an eine relationale DB generiert worden
sein.
© Prof. Kießling 2015
7 - 101
Beispiel: Transformation nach XHTML
MOZART:
XML


XSL
© Prof. Kießling 2015
XHTML
Browser
7 - 102
Generisches Rahmenprogramm für XSLT
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:transform version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- HTML format and to strip blank spaces and to preserve end-of-lines -->
<xsl:output version="4.0" method="html" indent="yes"
encoding="ISO-8859-1" doctype-public="-//W3C//DTD HTML 4.0
Strict//EN" doctype-system="http://www.w3.org/TR/html4/strict.dtd"/>
<!-- Verarbeitungsstart mit dem Wurzelknoten -->
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<!-- Anwendungsspezif. Transformationen, Funktionen und Definitionen →
<!-- vgl. folgende Folien -->
</xsl:transform>
© Prof. Kießling 2015
7 - 103
Einbettung im Ausgabeformat (z.B. XHTML)
<xsl:template match="MOZART">
<!--?xml version="1.0" encoding="iso-8859-1"?-->
<!--!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml/xhtml1/DTD/xhtml1-strict.dtd"-->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"/>
<title>Mozarts Werke in XHTML</title>
</head>
<body>
<table border="1" cellpadding="0" cellspacing="0" style="border-collapse:
collapse" width="100%"> <!-- weitere Tabellentags -->
<tbody> <xsl:apply-templates select="WERK"/> </tbody>
</table>
</body>
</html>
</xsl:template>
© Prof. Kießling 2015
7 - 104
Dynamisches Binden
<xsl:template match="WERK">
<tr> <!-- jeweils eine Zeile der Tabelle von Mozarts Werken -->
<!-- jeweils ein untergeordnetes Tag von "WERK" als Spalte darstellen -->
<td> <xsl:value-of select="KV"/>
</td>
<td> <xsl:value-of select="TONART"/>
</td>
<td> <xsl:value-of select="BESCHREIBUNG"/>
</td>
<td> <xsl:value-of select="JAHR"/>
</td>
<td> <xsl:value-of select="ORT"/>
</td>
</tr>
</xsl:template>
© Prof. Kießling 2015
7 - 105
Beispiele für Transformationen nach PDF:
 MOZART:
XML

XSL-FO
XSLT

--XMLSpy-->
XSL-FO--FOP-->
© Prof. Kießling 2015
PDF
PDF
PDF
7 - 106
Beispiele für Transformationen nach RTF:
 MOZART:
XML

Altova (proprietär)
XSLT
XML

XSL-FO

RTF
--XMLSpy-->

RTF
RTF
RTF
XSL-FO
--FOP-->
© Prof. Kießling 2015
7 - 107
Komplexes Beispiel:
 Publikationen von DBIS:
XML

XSLT + JavaScript
HTML
Browser
Gleichzeitige Verwendung zweier Programmierparadigma:
Funktionale Sprache (XSLT) + prozedurale Sprache (JavaScript)
© Prof. Kießling 2015
7 - 108
7.6 Online-Quellen
XSL-Familie:
http://www.w3.org/Style/XSL/
XPath 1.0:
http://www.w3.org/TR/xpath/
XSLT 3.0:
http://www.w3.org/TR/xslt-30/
XSL-FO:
http://www.w3.org/TR/2001/REC-xsl-20011015/slice6.html#fo-section
DOM:
http://www.w3.org/DOM/
© Prof. Kießling 2015
7 - 109
XPath 3.1:
http://www.w3.org/TR/xpath-31/
XQuery 3.1:
http://www.w3.org/TR/xquery-31/
XML-Beispiele:
http://www.xml.com/
Tools:
XMLSpy, (30 Tage kostenlos):
http://www.altova.com/xml-editor/
BaseX (Freeware von Uni KN, XPath 3.1, XQuery 3.1):
http://basex.org/
© Prof. Kießling 2015
7 - 110
Herunterladen