Query Transformation based on XSLT Gesamtsystem XML format 2 transformation component XML format 1 query transformation query XP2 query XP1 transformed XML fragment F2 XSLT stylesheet XSL processor XML fragment F1 XML-DB 1
Teilklasse von XPath XPath-Query XP2 beginnt mit / oder // Folge von Elementen, die durch / oder // getrennt voneinander sind, keine parent-axis (.. ) oder self-axis (. ) erlaubt Filter sind von der Art [@A1= const ], d.h. es wird ein Attribut A1 eines aktuellen Elementes mit einem konstanten Wert const verglichen Der XPath-Ausdruck XP2 endet mit /@*, d.h. alle Attribute des aktuellen Elementes werden wiederhergestellt. Beispiel: Ermittle alle Attribute des Elementes worker, welches ein Attribut family_name mit Wert Smith und als Vater ein Element level besitzt, welches wiederum ein direkter Nachfolger der Dokumentenwurzel ist : EBNF: AttributeQuery ::= LocationPath /@* LocationPath ::= Step* Step ::= ( / // ) Name Predicate* Predicate ::= [@ Name = String ] Teilklasse von XSLT XSLT-Stylesheet Folgende Knoten sind erlaubt: <xsl:stylesheet> <xsl:template match=m1> <xsl:element name=n> <xsl:attribute name=n> <xsl:apply-template select=s1/> <xsl:text> <xsl:value-of select=s2/> S1, S2 und M1 dürfen dabei keine axes, kein.,.., * und keine function calls enthalten 2
Bsp. Eingabedatei Hierarchie im Unternehmen: <employee surname= Wang > <responsible_for> <employee surname= Johnson > <responsible_for> <employee surname= Smith /> </responsible_for> </employee> <employee surname= Miller /> </responsible_for> </employee > Bsp. - Ausgabedatei Hierarchiestufen mit zugehörigen Mitarbeitern (ohne Information über direkten Vorgesetzten) <worker family_name= Wang /> <worker family_name= Johnson /> <worker family_name= Miller /> <worker family_name= Smith /> 3
Bsp. XSLT Stylesheet <xsl:template match= / responsible_for > <worker family_name= {@surname} /> Normalisiertes XSLT-Stylesheet 4
XSLT-Stylesheet als XML-Dokument XSLT-Stylesheet-Graph 5
/level/worker Successful Stylesheet Path über level nach worker! Notwendige Eingaben für successful stylesheet path über (/employee/responsible_for)*/employee /level/worker 6
, Attribute-Path, Filter-Path Filter-Path Attribute-Path Suche aller Output-Pfade zu XP2 Bearbeite Anfrage XP2 LocationStep für LocationStep beginne an Wurzel/am aktuellen Knoten des Stylesheets Tiefensuche - beginne an Wurzel des XSLT-Stylesheets - Suche aller Pfade zu Ausgabeknoten nextlocationstep - bei (<=> nextlocationstep unverändert und Zyklus im Stylesheet gelaufen ) => speichern in -Stylesheet-Path Tiefensuche stoppen. 7
Suche aller Output-Pfade zu XP2 Bearbeite Anfrage XP2 LocationStep für LocationStep beginne am aktuellen Knoten des Stylesheets /level Suche aller Pfade zu Ausgabeknoten level Abbruch, falls anderes Element ausgegeben wird //E2 Suche aller Pfade zu Ausgabeknoten E2 kein Abbruch, falls anderes Element ausgegeben wird /@* Suche aller Pfade zu Ausgabeknoten Attribut Abbruch, falls anderes Element ausgegeben wird //@* Suche aller Pfade zu Ausgabeknoten Attribut kein Abbruch, falls anderes Element ausgegeben wird Suche aller Filter-Pfade zu XP2 Bearbeite Anfrage XP2 LocationStep für LocationStep beginne am aktuellen Knoten des Stylesheets [@a=c] Suche aller Filter-Pfade zu Ausgabeknoten a und weiter zu Knoten, der Wert schreibt Abbruch, falls anderes Element/Attribut Falls geschriebener Wert Konstante C2 ist: Falls (C2!=C) Abbruch sonst return [true()] sonst /* geschrieben wird value-of-select X */ return [X] 8
Compute Input Path Expressions select = (/employee/responsible_for)*/employee[@surname] Filter-Path Attribute-Path Bsp. Query-Transformation Anfrage XP2 Suche aller Pfade zu XP2: LocationStep für LocationStep wird zu folgender Anfrage XP1 : (/employee/responsible_for)* / employee[@surname= Smith ] * : 0-n -malige Wiederholung 9
Gesamtsystem XML format 2 XML format 1 mapping component XP2=/level/worker [@family_name= Smith ]/@* query transformation XP1=(/employee/responsible_for)* /employee[@surname= Smith ] XSLT-Stylesheet XML-DB XML fragment F2 <worker family_name= Wang /> <worker family_name= Johnson /> <worker family_name= Miller /> <worker family_name= Smith /> XSL processor DBMS mit eingebautem XSLT mapping XML fragment F1 < employee surname= Wang > <responsible_for> <employee surname= Johnson > <responsible_for> <employee surname= Smith /> </responsible_for> </employee> <employee surname= Miller /> </responsible_for> </employee > Verknüpfung mehrerer Input-Pfade Im allgemeinen: mehrere Successful Stylesheet Paths ==> mehrere Input Path (Expressions) ==> alle mit verbinden ==> ein zusammenhängendes Fragment F1 aus der DB extrahieren 10