Dotazovací jazyk XQuery (16. 4.)
- obdoba SQL pro XML databáze
- v základu XPath, jednoduchý dotaz např.: doc('test')/people/person[@id='2']
- BaseX live demo: http://basex.org/products/live-demo/ + pokusný XML soubor
FLWOR
- FOR, RETURN
-
for $p in doc('test')/people/person return $p
for $p in doc('test')/people/person/name return $p
-
zobrazení části dokumentu, formát výstupu
for $p in doc('test')/people/person return $p/name
for $p in doc('test')/people/person[@id='2'] return $p/name/text()
for $p in doc('test')/people/person[@id='2'] return <jmeno>{$p/name/text()}</jmeno>
- LET, přiřazení
let $persons := doc('test')/people/person
for $p in $persons return $p/name
let $id := '2'
let $persons := doc('test')/people/person
for $p in $persons[@id=$id] return $p/name
- WHERE, podmínky
for $p in doc('test')/people/person where contains($p/name, 'Pav') return $p/name
for $p in doc('test')/people/person where count($p/cars/car)>0 return <zaznam><jmeno>{$p/name/text()}</jmeno><prijmeni>{$p/surname/text()}</prijmeni><pocet>{count($p/cars/car)}</pocet></zaznam>
for $p in doc('test')/people/person let $c := $p/cars/car where $c/year < 2000 return <zaznam><prijmeni>{$p/surname/text()}</prijmeni>{$c/type}</zaznam>
- ORDER, řazení
for $p in doc('test')/people/person order by $p/surname descending return $p/surname
- pozor, zrada - vícenasobné elementy, př. note se opakuje v jednom záznamu víckrát. Dotaz, který vás jako první napadne, nebude fungovat.
- for $p in doc('test')/people/person where contains($p/note, 'pozn') return $p/note
- správné řešení je zeptat se "hele, a nemáte tam note, který by splňoval tuhle podmínku?"
-
for $p in doc('test')/people/person where some $n in $p/note satisfies contains(upper-case($n), upper-case('pozn')) return <r><prijmeni>{$p/surname/text()}</prijmeni>{$p/note}</r>
- Úloha: Napište dotaz, který vypíše SPZ aut Škoda, která jsou starší než 1998.
- Úloha: Vypište id a plat lidí, kteří nemají auto.
- Úloha: Vypište součet platů.