Lehrstuhl für Praktische Informatik III Prof. Dr. Guido Moerkotte Email: moer@db.informatik.uni-mannheim.de Pit Fender B6, 29, Raum C0.02 68131 Mannheim Telefon: (0621) 181 2517 Email: pfender@pi3.informatik.uni-mannheim.de Datenbanksysteme 2 6. Übungsblatt Frühjahr-/Sommersemester 2013 24. April 2013 Aufgabe 1 Einige Fragen zu XML Version 1.0. Aufgabe 1 a) Darf man in der XML Declaration die Versionsnummer weglassen? (d.h. ist <?xml?> <trala/> ein wohlgeformtes XML-Dokument? Nein, siehe XML-Standard Abschnitt 2.8. Aufgabe 1 b) Dürfen Attributwerte nur mit oder auch mit begrenzt werden? Muss die Begrenzung für jedes Element einheitlich gewählt werden? Begrenzung ist mit und möglich, auch gemischt in einem Element (pro Attribut natürlich einheitlich), siehe XML-Standard Abschnitt 2.3. Aufgabe 2 Auf der Webseite der Vorlesung finden Sie ein Beispieldokument mondial.xml mit einer dazugehörigen DTD mondial.dtd. Diese Datei enthält einige geographische Informationen über die Länder der Erde. Machen Sie sich mit dem Dokument vertraut. Um die folgenden Teilaufgaben zu lösen, ist ein XPath-Auswerter zum Ausprobieren hilfreich. Bei allen unten aufgeführten Paketen handelt es sich um Auswerter für die Sprache XSLT, von der XPath eine Teilsprache ist. Auf der Webseite zur Vorlesung gibt es eine XSLT-Datei xpath.xsl. Wenn Sie in dieser Datei die Zeichenkette ###XPATHAUSDRUCK### durch einen XPath-Ausdruck ersetzen, und dann den jeweiligen XSLT-Auswerter mit der mondial.xml-datei und der xpath.xsl-datei laufen lassen, erhalten Sie die qualifizierenden Ergebnisknoten (Vorsicht: Beachten Sie, in welcher 1
Reihenfolge der jeweilige Auswerter die XML und die XSL-Datei benötigt). Das Xalan- C++-Paket enthält auch noch ein XPath-Auswertungsprogramm XPathWrapper, bei dem man XPath-Ausdrücke auch direkt auf der Kommandozeile angeben kann. Xalan for Java http://xml.apache.org/xalan-j/ Xalan for C++ http://xml.apache.org/xalan-c/ XSLTProc http://xmlsoft.org/xslt/xsltproc2.html Saxon http://saxon.sourceforge.net/ Galax http://www.galaxquery.org/ DB2 http://www-01.ibm.com/software/data/db2/express/download.html Hinweis: Bei einigen Linux-Distributionen sind die entsprechenden Pakete schon dabei oder können sehr einfach nachinstalliert werden. Geben Sie XPath-Ausdrücke für die folgenden Anfragen an. Aufgabe 2 a) Alle city-elemente. /descendant-or-self::city Aufgabe 2 b) Die name-elemente aller Städte. /descendant-or-self::city/child::name Aufgabe 2 c) Nur die Liste der Namen der Städte, d.h. die Text-Knoten der Namen ohne den Tag name. /descendant-or-self::city/child::name/child::text() Aufgabe 2 d) Berechnen Sie die Gesamtanzahl der Länder. count(/descendant-or-self::country) Aufgabe 2 e) 2
Berechnen Sie die Gesamtanzahl der Seen. count(/descendant-or-self::lake) Aufgabe 2 f) Berechnen Sie die Gesamtanzahl der Meere. count(/descendant-or-self::sea) Aufgabe 2 g) Geben Sie die Städte aus, die direkt unter den Ländern geschachtelt sind und nicht in einer Provinz liegen. descendant-or-self::country/city oder komplizierter descendant-or-self::city[not(parent::province)] Aufgabe 2 h) Wieviele Einwohner hat das Saarland? //province[name= Saarland ]/population Aufgabe 2 i) Bestimmen Sie die Namen der Länder, in denen es Städte mit mehr als 2000000 Einwohnern gibt. //country[descendant-or-self::city[population>2000000]]/name Aufgabe 2 j) In wievielen Ländern ist laut mondial.xml das Militär an der Regierung beteiligt? 3
count(//country[contains(government, military )]) Tückisch: Bei count(//country[contains( military,government)]) kommt dasselbe Ergebnis raus. Es sind aber andere Länder (count weglassen). Wieso? Aufgabe 2 k) Bestimmen Sie die Namen der Orte (nicht nur Städte!), die nördlicher als 70 Grad nördlicher Breite liegen. /descendant-or-self::*[latitude>70]/name Aufgabe 3 Erläutern Sie, warum die folgenden XPath-Ausdrücke jeweils unterschiedliche Ergebnisse liefern. Aufgabe 3 a) count(/self::mondial) count(/self::node()) Es wird in beiden Fällen der Wurzelknoten mit /self selektiert. Aber der Knotentest des ersten Ausdrucks verlangt jedoch einen Elementknoten mit Tagnamen mondial, wohingegen der Knotentest des zweiten Audrucks jeden Knoten akzeptiert. Der Wurzelknoten ist kein Elementknoten, sondern ein spezieller Dokumentknoten, der als Kind das Dokumentelement mondial hat. Aufgabe 3 b) descendant-or-self::city[position()>3 and position()=5] descendant-or-self::city[position()>3][position()=5] Im ersten Ausdruck könnte man auch nur schreiben position()=5. Der zweite Ausdruck erzeugt mit dem ersten Prädikat einen neuen Kontext, der eine neue Positionsnummerierung erhält. D.h. es wird von den Städten, die im ersten Kontext eine Position größer drei haben, die fünfte selektiert. Dies entspricht der achten Stadt, also ist der zweite Ausdruck auch äquivalent zu descendant-or-self::city[position()=8]. Aufgabe 3 c) 4
/descendant-or-self::country/descendant-or-self::city[position()=1] /descendant-or-self::country//city[1] (/descendant-or-self::country//city)[1] Der erste Ausdruck selektiert die erste Stadt in jedem Land. Der zweite Ausdruck ist in Langschreibweise /descendant-or-self::country/descendant-or-self::node()/child::city[position()=1] selektiert also jede Stadt, die das erste city-element unter dem jeweiligen Vaterknoten ist, also jede erste Stadt in jedem Land und in jeder Provinz. Der dritte Ausdruck selektiert nur die allererste Stadt. Aufgabe 3 d) //province[population>2000000][position()=last()] //province[position()=last()][population>2000000] Der erste Ausdruck selektiert von allen Provinzen die mehr als 2000000 Einwohner haben, jeweils die letzte pro Land. D.h. hier wird mindestens eine Provinz ausgegeben für jedes Land, welches Provinzen mit mehr als 2000000 Einwohnern hat, Der zweite Ausdruck selektiert alle die Provinzen, die die letzte Provinz in ihrem Land sind und mehr als 2000000 Einwohner haben. Hier wird nicht für jedes Land eine Provinz ausgegeben, selbst wenn das Land Provinzen mit mehr als 2000000 Einwohnern hat. Aufgabe 4 Vergleiche zwischen X und Y mit XθY ( θ {<,>,>=,<=, =,! =}) haben in XPath eine existenzquantifizierte Semantik, wenn X und/oder Y vom Typ node-set sind. In Verbindung mit der Negation erlaubt dies die Formulierung komplexerer Prädikate. Geben Sie (außer im Teil a) XPath-Ausdrücke für die folgenden Anfragen auf mondial.xml an. Aufgabe 4 a) Warum ist in XPath X! = Y nicht unbedingt äquivalent zu not(x = Y )? Wenn z.b. X mengenwertig ist, und Y nicht, dann gilt für X! = Y die Definition X! = Y x X : x Y 5
Für not(x = Y ) lät sich hingegen herleiten: not(x = Y ) x X : x = Y x X : x = Y x X : x Y D.h. der erste Ausdruck ergibt einen Existenzquantor, der zweite einen Allquantor! Entsprechendes gilt wenn stattdessen Y ein node-set ist, oder wenn Y und X vom Typ node-set sind. Auf der einen Seite verhalten sich negierte Vergleiche in XPath also etwas ungewöhnlich. Dies gibt einem aber auf der anderen Seite die Möglichkeit, Anfragen mit Allquantoren und/oder Existenzquantoren in XPath zu formulieren. Aufgabe 4 b) Für welche Länder sind keine Provinzen (in mondial.xml) mit weniger als 2 Millionen Einwohnern erfaßt? //country[not(province/population<2000000)] Aufgabe 4 c) Für welche Länder ist zwar mindestens eine Provinz erfaßt, aber keine davon hat weniger als 2 Millionen Einwohner? //country[province and not(province/population<2000000)] Aufgabe 4 d) Welches Land hat die meisten Einwohner? //country[population and not(number(population)<//country/population)]/name 6