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