XML adatkezelés 11. témakör
Az XQuery nyelv alapjai
dr Ková Kovács László szló
ME GEIAL
XQuery XQuery célja egy imperatív lekérdező nyelv biztosítása SQL
XPath
XSLT XQuery (nem XML)
Forrás XML
XQuery processzor
XDM
Eredmény XML
GEIAL Kovács László
1
XQuery XQuery jellemzői -- W3C szabvány 2007 óta -- halmazorientált -- gazdag kifejezőerő -- XML bemeneti adat és XML kimeneti adat -- a parancsok nem XML formátumban adottak -- XPath alapú -- SQL-hez hasonló (de laza a kapcsolat) -- XSLT vetélytársa -- procedurális elemeket is tartalmaz
GEIAL Kovács László
XQuery minta
XQuery
for $x in doc('xx9.xml')/adatbazis/autok/auto where $x/ar < 222 order by $x/tipus descending return
{$x/@rsz} {$x/tipus/text()} {$x/ar} {ll:felez($x/ar)} opel <ar>214 <emberek> …
opel 214 107
GEIAL Kovács László
2
XQuery feldolgozás váza XML alapadat
előfeldolgozás
parsing infoset validation
XMLSchema
post-schema validation infoset tree generation lekérdezés végrehajtás
XDM GEIAL Kovács László
XQuery feldolgozás váza XML alapadat XQuery
előfeldolgozás parsing
statikus elemzés
műveleti gráf OS
kontexus meghatározás kontexus leíró
külső XQuery
dinamikus elemzés GEIAL Kovács László
modulok betöltése névfeloldás, normalizálás normalizált műveleti gráf
3
XQuery feldolgozás váza előfeldolgozás statikus elemzés
műveleti lépések meghatározás
dinamikus elemzés
kifejezések kiértékelés kimenti atomok eredmény előállítás XML
sorosítás
XDM
GEIAL Kovács László
XQuery XQuery lekérdezés struktúrája (FLOWER) FOR elem LET elem ORDER BY elem WHERE elem RETURN elem
: ciklus : értékadás : rendezés : szelekció : projekció
for $x in doc('xx9.xml')/adatbazis/autok/auto where $x/ar < 222 order by $x/tipus descending return
{$x/@rsz} {$x/tipus/text()} {$x/ar} {ll:felez($x/ar)}
GEIAL Kovács László
4
XQuery XQuery nyelvi alapok XPath-ra épülő kifejezések: - element() : bármely csomópont - element(A,B) : A nevű, B típusú csomópont - attribute(A,B) : A nevű, B típusú elemjellemző - text() : szövegcsomópont - node() : bármely csomópont - node() * : bármely csomópont akárhányszor - attribute() + : egy vagy több elemjellemző - element(*,B)? : opcionális B típusú elem - derives-from(A,B) : A típus a B-ből származik-e - item() : csomópont vagy érték - comment() : megjegyzés GEIAL Kovács László
XQuery XQuery nyelvi alapok XPath-ra épülő kifejezések: szekvencia : (1,2,5,…,8) tartomány : 1 to 6 érték összehasonlítás : eq ne lt le gt ge szekvencia, tartomány összehasonlítás: =,<, >, != csomópont összehasonlítás : is << >> kifejezés megadása kiértékelésre: { kif } statikus eredmény XML struktúra felépítése:
Fiat, melynek ara {2+4}
GEIAL Kovács László
5
XQuery Egyértékű változó LET $v := ertek RETURN kifejezes let $x := (‘a’,’b’,’s’) return {$x} let $x := (‘a’,’b’,’s’) return $x
GEIAL Kovács László
XQuery Többértékű változó FOR $v IN lista RETURN kifejezes A változó végigfut a megadott halmaz elemein Implicit ciklus for $x in (‘a’,’b’,’s’) return {$x}
GEIAL Kovács László
6
XQuery XML dokumentum kijelölés fn:doc(file-specifikáció) Részfa kijelölés (XPath) fn:doc(file-specifikáció)/p1/p2/…
for $x in fn:doc("xx9.xml")/adatbazis/autok/auto return {$x} GEIAL Kovács László
XQuery Descartes-szorzat képzése FOR $v1 IN lista1 FOR $v2 IN lista2 … LET $w1 := kifejezes1 LET $w2 := kifejezes1 .. RETURN kifejezes for $x in ('a','b') for $y in ('c','d') let $z := 'e' return {$x} {$y} {$z} GEIAL Kovács László
7
XQuery Descartes-szorzat képzése for $x in doc('xx9.xml')/adatbazis/autok/auto for $y in doc('xx9.xml')/adatbazis/emberek/ember return {$x} {$y} let $b := doc('xx9.xml')/adatbazis for $x in $b/autok/auto for $y in $b/emberek/ember return {$x} {$y} GEIAL Kovács László
XQuery Descartes-szorzat képzése let $b := doc('xx9.xml')/adatbazis for $x in $b/autok/auto for $y in $b/emberek/ember return {$x/tipus/text()} {$y/nev/text()} {$x/@rsz}{$x/tipus/text()} {$y/nev/text()} GEIAL Kovács László
8
XQuery Szelekcio FOR $v IN lista LET $w := kifejezes WHERE feltetel RETURN kifejezes for $x in doc('xx9.xml')/adatbazis/autok/auto where $x/ar > 222 return {$x/@rsz}{$x/tipus/text()}
GEIAL Kovács László
XQuery Csomópontok létrehozása* FOR $v IN lista … RETURN {ELEMENT {nev} {ertek}} {ATTRIBUTE {nev}{ertek}} {TEXT{ertek}} for $x in doc('xx9.xml')/adatbazis/autok/auto where $x/ar > 222 return {element car {text{$x/@rsz}}} GEIAL Kovács László
9
XQuery Elemek rendezese FOR $v IN lista LET $w := kifejezes WHERE feltetel ORDER BY kifejezes mod RETURN kifejezes or $x in doc('xx9.xml')/adatbazis/autok/auto where $x/ar < 222 order by $x/tipus descending return {$x/@rsz} {$x/tipus/text()} GEIAL Kovács László
XQuery Minta a 200-nál drágább autok rendszáma for $v in fn:doc('xx9.xml')//auto where $v/ar>200 return element eredmeny {$v/@rsz} Auto rendszama es a tulaj neve
GEIAL Kovács László
for $a in fn:doc('xx9.xml')//auto for $e in fn:doc('xx9.xml')//ember where $a/@tulaj eq $e/@kod return element eredmeny { element auto {$a}, element tulaj {$e} }
10
XQuery Minta Autok rendszam es ar , ar szerint rendezve for $a in fn:doc('xx9.xml')//auto order by $a/ar return element auto {$a/tipus, $a/ar} A 200-nal dragabb autok rendszamai rsz sorrendben for $a in fn:doc('xx9.xml')//auto where $a/ar > 200 order by $a/@rsz return {$a/@rsz} GEIAL Kovács László
XQuery Minta Auto elemek rendszam tartalommal for $a in fn:doc('xx9.xml')//auto return element auto {text{$a/@rsz}} Autokhoz olyan elemek, melynek neve a rendszam erteke, tartalma: tipus, jellemzoje: ar for $a in fn:doc('xx9.xml')//auto return element {$a/@rsz} {attribute a {$a/ar} , text{$a/tipus}} GEIAL Kovács László
11
XQuery Gyökérelem létrehozása a ciklus köré <elem> { FOR $v IN lista RETURN kifejezes } { for $a in fn:doc('xx9.xml')//auto return element car {$a/tipus} } GEIAL Kovács László
XQuery Feltételes végrehajtás FOR $v IN lista … RETURN IF (kifejezes) THEN kifejezes ELSE kifejezes for $x in doc('xx9.xml')/adatbazis/autok/auto return {$x/@rsz} {$x/tipus/text()} {$x/ar} {if ($x/ar>151) then 'sok' else 'keves'} GEIAL Kovács László
12
XQuery { for $x in doc('xx9.xml')/adatbazis/autok/auto return {$x/@rsz} {if ($x/ar>151) then 'sok' else 'keves'} } { for $a in fn:doc('xx9.xml')//auto return element car { text {$a/tipus}, element ar {if ($a/ar/@valuta eq 'USD') then text {250*$a/ar} else text {$a/ar} }} } GEIAL Kovács László
XQuery Gyári függvények
doc() uppercase() substring() max() min() avg() sum() count() distinct-values() every $x in kif1 satisfies kif2 some $x in kif1 satisfies kif2
GEIAL Kovács László
13
Autotipusok es autoik
XQuery
{ for $t in fn:distinct-values( fn:doc('xx9.xml')//auto/tipus ) return element tipus {attribute tip {$t}, element autok { for $a in fn:doc('xx9.xml')//auto where $a/tipus eq $t return element auto {$a/@rsz} } } } GEIAL Kovács László
Tipusok es darabszamuk { for $t in fn:distinct-values( fn:doc('xx9.xml')//auto/tipus ) return element tipus {attribute tip {$t}, attribute db {count( for $a in fn:doc('xx9.xml')//auto where $a/tipus eq $t return element auto {$a/@rsz} ) } } } GEIAL Kovács László
14
XQuery Gyári függvények for $x in doc('xx9.xml')/adatbazis/autok return {fn:avg($x//ar)} { fn:count( for $x in doc("xx9.xml")/adatbazis/autok/auto where $x/ar > 211 return $x ) } GEIAL Kovács László
XQuery Gyári függvények Akiknek nincs autoja for $e in fn:doc('xx9.xml')//ember let $a := fn:doc('xx9.xml')//auto[@tulaj = $e/@kod] where fn:count($a) eq 0 return element ember {$e/nev} for $e in fn:doc('xx9.xml')//ember where not (some $x in fn:doc('xx9.xml')//auto satisfies $e/@kod eq $x/@tulaj) return element ember {text {$e/nev}} GEIAL Kovács László
15
XQuery Saját függvények létrehozása
DECLARE NAMESPACE prefix=kifejezes; DECLARE FUNCTION prefix:fnev ($p1 AS t1,..) AS rtip { utasitasok… RETURN kifejezes }
GEIAL Kovács László
XQuery Saját függvény declare namespace ll="http:me.kl"; declare function ll:felez($x as xs:decimal) as xs:decimal { let $c:=2 return $x div $c }; for $x in doc('xx9.xml')/adatbazis/autok/auto where $x/ar < 222 order by $x/tipus descending return {$x/@rsz} {$x/tipus/text()} {$x/ar} {ll:felez($x/ar)} GEIAL Kovács László
16
Elso n szam osszege
XQuery
declare namespace ll="http:me.kl"; declare function ll:ossz($r as xs:integer) as xs:integer { let $x := 1 return ( if ($r > 0) then $r + ll:ossz($r -1) else 0 ) }; let $x := 5 return <ered> {ll:ossz($x)} GEIAL Kovács László
XQuery A függvény argumentuma és visszatérési értéke lehet csomópont típusú is declare function local:order-value ($po as element(purchase-order)) as xs:double { sum($po/order-item/(@price * @quantity)) }; node() element() element(nev) attribute() attribute(nev)
Any node Any element node Any element with name nev
GEIAL Kovács László
17
XQuery declare namespace ll="http:me.kl"; declare function ll:felez($x as element(auto)) as element(mind) { let $c:=2 return element mind {$x/tipus} }; for $x in doc('xx9.xml')/adatbazis/autok/auto where $x/ar < 222 order by $x/tipus descending return {ll:felez($x)}
GEIAL Kovács László
XQuery
Az exp(x) kiszamitasa Rekurziv algoritmus exp(x) = 1 + exp2(x, 1, s, n, m) exp2(x, i, s, n, m) = (s*x)/(n*i) + exp2(x,i+1,s*x, n*i, m), ha i<m
GEIAL Kovács László
18
XQuery Az exp(x) kiszamitasa declare function ll:exp($x as xs:decimal) as xs:decimal { let $s := 1 let $n := 1 let $m := 10 let $i:=1 return 1 + ll:exp2($x,$i,$s,$n,$m) }; let $x := 2 return <ered> {ll:exp($x)} GEIAL Kovács László
Az exp(x) kiszamitasa
XQuery
declare function ll:exp2($x as xs:decimal, $i as xs:integer, $s as xs:integer, $n as xs:integer, $m as xs:integer) as xs:decimal { let $us := $s*$x let $un := $n*$i return ( if ($i < $m) then $us div $un + ll:exp2($x,$i+1,$us,$un,$m) else $us div $un ) }; GEIAL Kovács László
19