Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
© Prof. Kießling 2016 7 - 30
7.2.2 Spezifikation einer Treffermenge
Das Ergebnis der Auswertung eines XPath Ausdrucks (Version 1.0) isteine Liste von Knoten.
Folgende Schritte sind bei einer Anfrage auszuführen:
1.) Festlegung des Kontextknotens „self“ zum Start der Navigation.
2.) Ausgehend vom „self“ eine Achse festlegen, wodurch eine Menge K vonKnoten 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).
© Prof. Kießling 2016 7 - 31
7.2.3 Navigation
Alle Achsen sind immer relativ zum aktuellen Kontextknoten.
ancestor:: parent::
© Prof. Kießling 2016 7 - 32
7.2.3 Navigation
Alle Achsen sind immer relativ zum aktuellen Kontextknoten.
descendant:: child::
© Prof. Kießling 2016 7 - 33
7.2.3 Navigation
Alle Achsen sind immer relativ zum aktuellen Kontextknoten.
preceding-sibling:: following-sibling::
© Prof. Kießling 2016 7 - 34
Kontext-Knoten
descendant axis
self axis
child axis
Zusätzlich kann der Kontext-Knoten in der Ergebnisknotenmenge miteingeschlossen werden, indem die Achse „descendant-or-self“ oder „ancestor-or-self“ gewählt wird.
parent axis
ancestor axis
© Prof. Kießling 2016 7 - 35
Übersicht NavigationKurzform Langform Bedeutung
Name child:: Alle direkten Kinder
// descendant:: Alle Nachfolger
@ attribute:: Attribute mit bestimmtemNamen
self:: Der Kontextknoten selbst
descendant-or-self:: Der aktuelle Knoten oderalle Nachfolger
following-sibling:: Alle nachfolgendenElemente gleicher Ebenemit gleichem Elternknoten
following:: Alle Elemente imDokument, die nach demaktuellen Knoten auftreten
© Prof. Kießling 2016 7 - 36
Übersicht NavigationKurzform Langform Bedeutung
.. parent:: Der Elternknoten des aktuellenKnotens
ancestor:: Alle Vorgänger des aktuellenKnotens
preciding-sibling:: Alle vorhergehenden Elementegleicher Ebene mit gleichemElternknoten
preceding:: Alle Elemente im Dokument, die vordem aktuellen Knoten auftreten
ancestor-or-self:: Der aktuelle Knoten und alleVorgänger
© Prof. Kießling 2016 7 - 37
parent
preceding-sibling
following-sibling
Navigation in XML-Darstellung
Kontextknoten
<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 K. </BESCHREIBUNG> <TONART> G-Dur </TONART>
</WERK>
…
<MOZART/>
© Prof. Kießling 2016 7 - 38
descendantschild
child
Navigation in XML-Darstellung
Kontextknoten
<MOZART xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Mozart.xsd">
<WERK> <KV> KV 1 </KV> <JAHR> 1761 </JAHR> <ORT>Salzburg
<Adresse> Madresse </Adresse></ORT>
<BESCHREIBUNG>Menuett</BESCHREIBUNG> <TONART> G-Dur </TONART> </WERK>
…
<MOZART/>
© Prof. Kießling 2016 7 - 39
c
Beispiel für XML-Syntaxbaum:
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- XML-Datei mit EINEM Werk von Mozart: --><?xml-stylesheet href="mystyle.css" type="text/css"?>
<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>
7.2.4 Knotentests
/
Mns
Wpi
KJ
OB
T
G-Dur
a
a
cpi
O
© Prof. Kießling 2016 7 - 40
XPath verarbeitet Anfragen stets für ein einzelnes XML-Dokument. Dieses muss derverwendeten XPath-Engine (Programmiersprache, Kommandozeilenprogramm, XML-Datenbank) explizit übergeben werden.
Es gibt folgende Knotentypen und Knotentests:
Wurzelknoten entspricht “/”. Er hat keinen Knotentest.Mögliche Kinder: genau 1 Elementknoten (Dokumentknoten)
Kommentarknoten: comment()
<!-- Das ist ein Kommentar. -->
© Prof. Kießling 2016 7 - 41
Elementknoten: element(Name, Typ) oder Name
<elementName> … </elementName>
Beliebiges Element: *
<elementName> … </elementName>
Textknoten: text()
<titel> Prof. </titel>
Beliebiger Knoten: node()
<elementName1> ... </elementName1>
<elementName2> text </elementName2>
© Prof. Kießling 2016 7 - 42
Attributknoten: attribute(Name, Typ) oder @Name
<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 2016 7 - 43
Beispiel für (verkürzten) XML-Syntaxbaum:
<?xml version="1.0" encoding="iso-8859-1"?><!-- XML-Datei mit EINEM Werk von Mozart: --><?xml-stylesheet href="mystyle.css" type="text/css"?>
<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>
/
Mns
Wpi
KJ
OB
T
c
G-Dur
a
a
cpi
O
© Prof. Kießling 2016 7 - 44
Beispiele für Navigation und Knotentests:/ /* ebenso /MOZART/MOZART/* ebenso /MOZART/WERK/MOZART/WERK/@*/MOZART/WERK/processing-instruction()/MOZART/WERK/*/MOZART/WERK/JAHR/MOZART/WERK/JAHR/text()/MOZART/WERK/JAHR/comment() //JAHR/comment()
/
M
a
W
K J O B T
c
1741
ns
pi
c
© Prof. Kießling 2016 7 - 45
7.2.5 Prädikate
Prädikate stehen zwischen eckigen Klammern. Die bislang durch Achseund Knotentest bestimmte Knotenmenge K wird durch Prädikate weitereingeschränkt (exact match). Es werden Knoten zurückgeliefert, die dieBoolesche Bedingung des Prädikats erfüllen.
Beispiele: Position [1 … position( ) = n … last( )]
Statt [position()=n] kann verkürzt [n] geschrieben werden.
/MOZART/WERK [5]
/MOZART/WERK [last( ) - 1]
Arithmetische Vergleiche
/MOZART/WERK [position( ) < 3]
/MOZART/WERK [JAHR > 1762]
© Prof. Kießling 2016 7 - 46
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 2016 7 - 47
Stringfunktionen:
boolean contains(string, string) string concat(string, string, ...) boolean starts-with(string, string)
Weitere Stringfunktionen im Beispiel: substring-before("1999/04/01", "/") "1999" substring-after("1999/04/01", "/") "04/01" substring("12345", 2, 3) "234"
Beispiele:/MOZART/WERK [contains (TONART, 'Dur')]/MOZART/WERK [contains (BESCHREIBUNG, 'Andante')]
© Prof. Kießling 2016 7 - 48
Mengenoperatoren:
Für die Vereinigung zweier Knotenmengen K1 ∪ K2: „|“ oder union
Beispiel:
/MOZART/WERK [JAHR < 1775] | /MOZART/WERK [TONART = 'As-Dur']
Weitere Operatoren: intersect, except
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 2016 7 - 49
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 2016 7 - 50
Die Ergebnisse sind Elemente der Knotenmenge, die im letzten Lokali-sierungsschritt 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 MozartsWerken aus dem Jahr 1761
/MOZART/WERK [position() < 180] /KV [contains (. ,'11')]
Menge der IDs von Mozarts Werken, die vor der Position 180 derWerke liegen, und deren Köchel-Verzeichnisnummer den String '11'enthält.
7.2.6 Ergebnisprojektion