Jazyky XQuery a XPath 1



Podobné dokumenty
PRG036 Technologie XML

PRG036 Technologie XML

Aplikace počítačů v provozu vozidel 9

Budování aplikačních rozhraní pro obousměrnou komunikaci mezi ERMS a jejich vztah k Národnímu standardu pro komunikaci mezi ERMS.

Příloha č. 54. Specifikace hromadné aktualizace SMS-KLAS

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Databázové a informační systémy

V této části manuálu bude popsán postup jak vytvářet a modifikovat stránky v publikačním systému Moris a jak plně využít všech možností systému.

ČÁST PÁTÁ POZEMKY V KATASTRU NEMOVITOSTÍ

Algoritmizace a programování

Moderní technologie ve studiu aplikované fyziky CZ.1.07/2.2.00/ Reálná čísla

1.7. Mechanické kmitání

Regenerace zahrady MŠ Neděliště

Algoritmizace a programování

3 Vývojová prostředí, základní prvky jazyka Java, konvence jazyka Java

Bakalářská práce. Vladimír Mareš

MOBILNÍ KOMUNIKACE STRUKTURA GSM SÍTĚ

Co najdete v ASPI? (pro uživatele SVI FSE UJEP)

účetních informací státu při přenosu účetního záznamu,

-1- N á v r h ČÁST PRVNÍ OBECNÁ USTANOVENÍ. 1 Předmět úpravy

Data v počítači EIS MIS TPS. Informační systémy 2. Spojení: jan.skrbek@tul.cz tel.: Konzultace: úterý

Uložené procedury Úvod ulehčit správu zabezpečení rychleji

Kótování na strojnických výkresech 1.část

Soubory a databáze. Soubor označuje množinu dat, která jsou kompletní k určitému zpracování a popisují vybrané vlastnosti reálných objektů

VYR-32 POKYNY PRO SPRÁVNOU VÝROBNÍ PRAXI - DOPLNĚK 6

Seriál: Management projektů 7. rámcového programu

NÁVRHOVÝ PROGRAM VÝMĚNÍKŮ TEPLA FIRMY SECESPOL CAIRO PŘÍRUČKA UŽIVATELE

M. Balíková, R. Záhořík, NK ČR 1

OBEC HORNÍ MĚSTO Spisový řád

Orientační průvodce mateřstvím a rodičovstvím v zadávacích dokumentacích poskytovatele

54_2008_Sb 54/2008 VYHLÁŠKA. ze dne 6. února 2008

Čl. 3 Poskytnutí finančních prostředků vyčleněných na rozvojový program Čl. 4 Předkládání žádostí, poskytování dotací, časové určení programu

FOND VYSOČINY NÁZEV GP

Manuál Kentico CMSDesk pro KDU-ČSL

Náležitosti nutné k zahájení znaleckých úkonů

170/2010 Sb. VYHLÁŠKA. ze dne 21. května 2010

S_5_Spisový a skartační řád

Neuronová síť. x 2 x 3. σ j. x 4. x 5. Menu: QCExpert Prediktivní metody

Matematický model kamery v afinním prostoru

4.5.1 Magnety, magnetické pole

KRAJSKÝ ÚŘAD JIHOMORAVSKÉHO KRAJE Odbor dopravy Žerotínovo náměstí 3/5, Brno

VYUŽITÍ NEURONOVÝCH SÍTÍ PROSTŘEDÍ MATLAB K PREDIKCI HODNOT NÁKLADŮ PRO ELEKTRICKÉ OBLOUKOVÉ PECE

Jazyk S Q L základy, příkazy pro práci s daty

7. Domy a byty Charakteristika domovního fondu

Postup šetření pro rok Ministerstvo pro místní rozvoj Odbor veřejného investování

PŘÍLOHA 1.6 SMLOUVY O PŘÍSTUPU K VEŘEJNÉ PEVNÉ KOMUNIKAČNÍ SÍTI LOGISTIKA KONCOVÝCH ZAŘÍZENÍ

I. Objemové tíhy, vlastní tíha a užitná zatížení pozemních staveb

Zadávací dokumentace

Nástroje produktivity

Objektově orientované databáze

Software IS Řízení stavebních zakázek

ROZDÍLY MEZI RDF MODELEM A TOPIC MAPS DIFFERENCES BETWEEN RDF MODEL AND TOPIC MAPS. Martin Žáček

Číslicová technika 3 učební texty (SPŠ Zlín) str.: - 1 -

OBOUSMĚRNÝ PŘEKLAD V ELETRONICKÝCH SLOVNÍCÍCH ZNAKOVÉHO JAZYKA

S t r á n k a 1 I N V E S T I C E D O R O Z V O J E V Z D Ě L Á V Á N Í

Novela zákona o DPH a změny v programu Účtárna k

Výzva k podání nabídek (zadávací dokumentace)

ZADÁVACÍ DOKUMENTACE

DODATEČNÉ INFORMACE Č. 4 K ZADÁVACÍM PODMÍNKÁM VEŘEJNÉ ZAKÁZKY

Ústavní sociální služby pro osoby s postižením v Moravskoslezském kraji

Česká zemědělská univerzita v Praze Fakulta provozně ekonomická. Obor veřejná správa a regionální rozvoj. Diplomová práce

Memoria Mundi Series Bohemica z trezoru na Internet

Jihočeský vodárenský svaz S. K. Neumanna 19, České Budějovice

Exponenciála matice a její užití. fundamentálních matic. Užití mocninných řad pro rovnice druhého řádu

Posouzení stávající soustavy vytápění. Posouzení stávající soustavy vytápění. Semináře JOULE 2012 Ing. Vladimír Galad

Pracovní návrh. VYHLÁŠKA Ministerstva práce a sociálních věcí. ze dne o hygienických požadavcích na prostory a provoz dětské skupiny do 12 dětí

Na následující stránce je poskytnuta informace o tom, komu je tento produkt určen. Pro vyplnění nového hlášení se klikněte na tlačítko Zadat nové

Databáze Caché CSP Custom Tags

SKLÁDANÉ OPĚRNÉ STĚNY

Katedra obecné elektrotechniky Fakulta elektrotechniky a informatiky, VŠB - TU Ostrava 16. ZÁKLADY LOGICKÉHO ŘÍZENÍ

2/3.3 Spis. Správní řád v praxi. 2/3.3 str. 1

téma: Formuláře v MS Access

1.2.5 Reálná čísla I. Předpoklady:

Modul Řízení objednávek.

Pravidla. používání Národního elektronického nástroje při realizaci zadávacích postupů prostřednictvím národního elektronického nástroje

Dotační program města Uherský Brod na podporu kulturních akcí

Kočí, R.: Účelové pozemní komunikace a jejich právní ochrana Leges Praha, 2011

Město Mariánské Lázně

3.5.8 Otočení. Předpoklady: 3506

Pracovní právo seminární práce

VNITŘNÍ NORMA (Směrnice) č. 4/2010

Vymezení poloz ek způ sobily ch ná kládů meziná rodní ch projektů ná principů LA pro rok 2017

METODICKÝ POKYN NÁRODNÍHO ORGÁNU

EVROPSKÝ PARLAMENT Výbor pro životní prostředí, veřejné zdraví a bezpečnost potravin NÁVRH STANOVISKA

c sin Příklad 2 : v trojúhelníku ABC platí : a = 11,6 dm, c = 9 dm, α = Vypočtěte stranu b a zbývající úhly.

Zásady pro vypracování disertační práce Fakulty strojní VŠB-TUO

Malé vodní elektrárny

MDT xxx TECHNICKÁ NORMA ŽELEZNIC Schválena: Ochrana zabezpečovacích zařízení před požárem

Příprava na 1. čtvrtletní písemku pro třídu 1EB

Podrobný postup pro doplnění Žádosti o dotaci prostřednictvím Portálu Farmáře. 1. kolo příjmu žádostí Programu rozvoje venkova ( )

Uložení potrubí. Postupy pro navrhování, provoz, kontrolu a údržbu. Volba a hodnocení rezervy posuvu podpěr potrubí

Měření změny objemu vody při tuhnutí

Zadávací dokumentace pro podlimitní veřejnou zakázku na dodávky

MĚSTO BENEŠOV. Rada města Benešov. Vnitřní předpis č. 16/2016. Směrnice k zadávání veřejných zakázek malého rozsahu. Čl. 1. Předmět úpravy a působnost

Z A D Á N Í. zmìny è. 2. územního plánu sídelního útvaru MILOVICE. okres Nymburk kraj Středočeský. návrh k projednání únor 2008

Škola VOŠ a SPŠE Plzeň, IČO , REDIZO

VEŘEJNÁ NABÍDKA POZEMKŮ URČENÝCH K PRODEJI PODLE 7 ZÁKONA

T A X N E W S NOVELA ZÁKONA O ÚČETNICTVÍ A ZMĚNA PROVÁDĚCÍ VYHLÁŠKY. Obsah čísla. Listopad Tax l Accounting l Payroll

ZATÍŽENÍ SNĚHEM A VĚTREM

Transkript:

Jazyky XQuery a XPath 1 Karel Richta Katedra počítačů FEL ČVUT Karlovo nám. 13, 121 35 Praha 2 Tel: +420 2 2435 7319 e-mail: richta@fel.cvut.cz www: http://k336.felk.cvut.cz/~richta Klíčová slova: XML, XPath, XPointer, XLink, XQuery, XSLT Abstrakt: Mezi nástroje, pomocí kterých lze zpracovávat XML dokumenty lze zařadit jazyky XPath a XQuery. Jazyk XPath je prostředek pro navigaci v XML dokumentech. Nad jazykem XPath pak lze budovat dotazovací jazyky.zatím nejúspěšnější se zdá jazyk XQuery. Oba jazyky jsou doporučenými standardy konsorcia W3C. 1 Úvod Formát XML [2], [3] byl již široce akceptován jako obecně přijatelný formát pro výměnu dat a dokumentů. Byly navrženy a implementovány nástroje, pomocí kterých lze XML dokumenty analyzovat, rozkládat a zpracovávat. Základem pro takové zpracování je prostředek pro navigaci v XML dokumentech. Potřebujeme např. ukázat na číslo účtu v rámci dokumentu reprezentujícího objednávku. Takovým prostředkem je jazyk XPath. Nad jazykem XPath lze budovat další nástroje. Kolekci XML dokumentů lze považovat za databázi, jejímž obsahem jsou právě tyto dokumenty. Podobně jako u jiných databází, potřebujeme pro práci s databází nějaký jazyk, kterým se můžeme na obsah takové databáze ptát, resp. modifikovat její obsah. Účelem těchto jazyků není pouze dotazování, nýbrž také možnost vytvářet pohledy nad XML daty, možnost transformovat XML data, případně možnost specifikovat množinu XML dat, která má být aktualizována. Existuje mnoho pokusů zformulovat dotazovací jazyk pro XML dokumenty, který by byl jakousi obdobou jazyka SQL pro relační data. Od r. 1998 se objevila řada jazyků, na kterých se vyvíjely nové konstrukty a koncepce dotazování pro XML dokumenty. Patří sem např. jazyky XML-QL, XQL a mnoho dalších. Zatím nejúspěšnější se zdá jazyk XQuery [1][8]. Jazyk XQuery [1] patří do rodiny jazyků, které pro manipulaci s XML dokumenty specifikovalo konsorcium W3C. Patří sem také jazyk XPath [4], určený pro navigaci v XML dokumentech a jeho doplňky XPointer a XLink, určené pro popis vazeb mezi XML daty, a také jazyk XSLT, který byl vytvořen přímo pro transformace XML dat. Všechny tyto jazyky procházejí dalším vývojem. Jazyk XSLT byl vytvořen přímo pro transformace XML dat. Využívá výrazů v XPath a taktéž samotný jazyk XML. Z jistého hlediska lze XSLT považovat rovněž za dotazovací jazyk předepíšeme jím transformaci stavu XML databáze do výstupu dotazu. Podobně i jazyk XPath můžeme považovat za dotazovací výraz v XPath lze považovat za vzorek, označující dokumenty obsahující podobnou cestu. Vhodnější pro dotazování je ale jazyk XQuery, díky své více uživatelsky orientované syntaxi. 1 Tento text vznikl při práci na výzkumných záměrech MŠMT č. MSM 6840770014 a rovněž byl částečně sponzorován z grantu GAČR č.201/06/0756. 1

Jazyky XPointer a XLink lze rovněž zařadit mezi dotazovací jazyky nad XML daty, byť se poněkud vymykají běžné představě o dotazovacích jazycích. Pomocí jazyka XPointer [5] je možné přiřadit identifikátor k místům v XML dokumentech umístěných ve zdrojích adresovatelných pomocí URI (Uniform Resource Identifier). Jazyk XLink [9] slouží k popisu vazeb mezi XML daty. XLink nabízí obecný mechanismu pro zanoření vazeb mezi XML dokumenty do XML dokumentů samotných. Jde tedy spíše o prostředek modelování vybudovaný nad XML, jehož použití pak ovšem může mít vliv na koncipování dotazovacího jazyka. Vzhledem k jejich důležitosti je tento příspěvek věnován jazykům XQuery a XPath. Verze jazyka XPath označovaná jako XPath 2.0 je koncipována tak, že tvoří vlastní podmnožinu jazyka XQuery. Oba jazyky pak mají společný datový model. Oba jsou doporučenými standardy konsorcia W3C. Vzhledem ke složitosti jazyka XQuery, věnujeme se zejména základním rysům tohoto jazyka. Nejprve ale popíšeme jazyk XPath, který tvoří jeho součást. 2 Jazyk XPath Jazyk XPath [4] je prostředek, který poskytuje možnost alokovat specifické části XML dat. Je charakterizován následujícímu rysy: je jazykem použitelným pro výběr částí XML dokumentu (např. pro označování vzorků v jazyce XSLT), způsob, jakým XPath popisuje cesty k elementům, je podobný způsobu, jakým v rámci systému ovládání souborů popisujeme cesty k souborům, notace jazyka není založena na notaci XML (výraz v jazyce XPath není správný výraz podle XML), na XPath jsou založeny jazyky XSLT, XPointer a XQuery. Jazyk XPath má dvě verze verzi 1.0 (prosinec 1999) a verzi 2.0 (prosinec 2003). Verze 2.0 byla vytvořena proto, aby se rodina XML jazyků harmonizovala okolo stejného datového modelu. Primárně byl navržen tak, aby jej bylo možno využívat jako součást jiných jazyků. Verze 2.0 podporuje definici schémat pomocí jazyka XML-Schema, umí podmíněné výrazy, umožňuje selekci na základě typů a zahrnuje řadu nových funkcí. Poslední modifikace byla v době přípravy tohoto textu z prosince 2005. 2.1 Model XML dat v XPath Pro jakýkoliv dotazovací jazyk je typické, že pracuje s nějakým modelem dat. Tomuto modelu odpovídají zpracovávaná data i výstup dotazů. Model XML dat pro jazyk XPath [6] je stromově orientovaný XML dokument je reprezentován jako strom. Tento strom vždy vyrůstá ze speciálního kořene dokumentu. Z kořene pak vychází další reprezentace XML dokumentu, každý prvek dokumentu je reprezentován uzlem stromu, různé prvky jsou reprezentovány různými typy uzlů.. Existuje sedm typů uzlů (na rozdíl od modelu Infoset [5], kde existuje 11 typů uzlů): kořenový uzel, uzly elementů, textové uzly, atributové uzly, uzly pro komentáře, uzly instrukcí pro zpracování, uzly jmenných prostorů. Vazby mezi prvky jsou ve stromě reprezentovány orientovanými hranami. Všimněme si, že model neobsahuje sekce CDATA a ani odkazy na entity a DTD. Mezi neobvyklé rysy modelu patří fakt, že kořen stromu není stejný jako uzel kořenového elementu. Zkonstruujeme na ukázku model XML dat pro fragment textu: 2

<P>Zde je nějaký<hi TYPE= ital >zvýrazněný</hi>text.<p> Odpovídající model je na Obr. 2.1. uzel elementu / P kořenový uzel uzel elementu textový uzel textový uzel Zde je nějaký HI text. atributový uzel TYPE ital zvýrazněný textový uzel Obr. 2.1 Model XML dat v XPath Uzly ve stromu, který reprezentuje XML dokument jsou uspořádány podle tzv. uspořádání dokumentu (dokument order), které z hlediska stromu odpovídá jeho průchodu doleva-do hloubky. Pro práci s modelem XML dat je také důležitý pojem řetězcové hodnoty uzlu (string value). Např. pro atribut je to normalizovaná hodnota atributu, pro element je to zřetězení všech textových uzlů, které jsou jeho potomky, v souladu s upořádáním dokumentu. Pro dokument odpovídající stromu na Obr. 2.1 je řetězcová hodnota uzlu P rovna: Zde je nějakýzvýrazněnýtext Řetězcové hodnoty uzlů jsou využívány při porovnávání s jinými objekty. 2.2 Výrazy jazyka XPath Základním stavebním kamenem výrazů jazyka XPath je tzv. krok (step). Krok je skutečně zamýšlen jako krok v XML dokumentu, přesněji v reprezentaci XML dokumentu. Výraz v jazyce XPath je tvořen posloupností kroků, oddělených znakem /. Interpretace výrazu spočívá v postupné interpretaci jednotlivých kroků. Každý krok je interpretován vzhledem k aktuálnímu kontextu. Kontextem se myslí jednak aktuální poloha v dokumentu, dále pak stav globálních objektů a prostředí. Interpretací kroku se kontext změní, následující krok se interpretuje v novém kontextu. Kontext, do kterého vstoupíme posledním krokem je výstupem vyhodnocení výrazu vzhledem ke vstupnímu kontextu. Význam výrazu je pak sada objektů, nacházejících se v daném kontextu v aktuální poloze. Chceme-li učinit krok, musíme se rozhodnout, kterým směrem půjdeme. v jazyce XPath se těmto směrům říká osy (axis). Můžeme např. kráčet po elementech XML stromu, můžeme zamířit k atributům uzlu, či ke jmennému prostoru. Každý jednotlivý krok je určen osou a testem na uzel v tomto směru. Krok určitým směrem se zapisuje: osa::test-na-uzel kde osa určuje směr, test na uzel specifikuje požadované vlastnosti uzlu. Seznam os XPath podává následující tabulka, jejich význam lze také vyčíst z Obr. 2.2. child:: descendand:: descendand-or-self:: Přímí potomci aktuálního uzlu. Všichni potomci aktuálního uzlu. Aktuální uzel a všichni potomci. 3

self:: ancestor-or-self:: ancestor:: parent:: following:: preceding:: following-sibling:: preceding-sibling:: attribute:: namespace:: Aktuální uzel. Aktuální uzel a všichni jeho předci. Všichni předci aktuálního uzlu. Rodič aktuálního uzlu. Všechny uzly, které se v toku XML dokumentu nacházejí za aktuálním uzlem. Všechny uzly, které se v toku XML dokumentu nacházejí před aktuálním uzlem. Všichni následující sourozenci aktuálního uzlu. Všichni předcházející sourozenci aktuálního uzlu. Atributy aktuálního uzlu. Deklarované jmenné prostory. ancestor preceding-sibling following-sibling self child preceding attribute namespace descendant following Obr. 2.2: Osy v modelu XPath Implicitní osou je osa přímých potomků (child). Uvažme jednoduchý XML dokument, reprezentující vydané knihy, uložený v souboru books.xml : <books> <book year= 2003 > <title>java Programming</title> <author><first>jack</first><last>norris</last></author> <author><first>martin</first><last>white</last></author> <ISBN>9876543210</ISBN> <price>750</price> </book> <book>...</book> </books> Jednoduchý příklad výrazu v XPath představuje dotaz na tituly knih v tomto dokumentu: doc( books.xml )/descendant::books/descendant::book/child::title 4

Počáteční kontext představuje dokument uložený v souboru books.xml. Začneme postupovat od jeho kořene ( / ), vydáme se ve směru následníků nejprve všechny knihy, tj. následníka typu books, pak každou jednotlivou knihu book, a z nich pak vezmeme bezprostřední potomky typu title. Výstupem bude posloupnost všech elementů typu title obsažených v dokumentu: <title>java Programming</title>... Implicitně se postupuje po ose child, atributy se označují @, aktuální uzel se zkrátí na., rodič se značí... Výše uvedený dotaz lze pak zkrátit na: doc( books.xml )/books/book/title Výsledek vyhodnocení výrazů jazyka XPath se liší pro verzi 1.0 a 2.0. Ve verzi 1.0 je významem výrazu buď primitivní hodnota (řetězec, číslo nebo logická hodnota), nebo množina uzlů (node-set). Ve verzi 2.0 je výsledkem vyhodnocení výrazu buď primitivní hodnota (řetězec, číslo nebo logická hodnota), nebo posloupnost bere se v úvahu, že výstup dotazu bývá uspořádán. Upřesněme nyní sémantiku dotazu v jazyku XPath. Krok (jednoduchá cesta) je vyhodnocen vždy vzhledem k nějakému kontextu. Krok má obecně syntaxi: osa::test-na-uzel[predikát]* Osa vybírá směr pohybu, testem na uzel se provede základní výběr kandidátů, založený na typu uzlu, které mají být vybírány (obvykle jméno elementu). Predikát slouží k další filtraci uzlů. Všimněme si, že predikáty lze řadit do posloupnosti. To však není obvykle nutné, protože stejného efektu se docílí pomocí logického součinu dílčích predikátů. Uvažme opět jednoduchý příklad výrazu v XPath, který představuje dotaz na tituly knih, tentokrát knih publikovaných v roce 2003: doc( books.xml )/books/book[@year= 2003 ]/title Oproti výše uvedenému příkladu nás zde zajímají pouze knihy, které mají atribut year s hodnotou 2003. Z nich pak vezmeme potomky elementy typu title. Predikáty představují logické podmínky, kterými lze omezit specifikovaný výběr uzlů. V jazyce XPath je to Booleovský výraz zapisovaný do hranatých závorek umístěných na konec jednoduché cesty. V predikátech lze využívat porovnání, porovnávají se XPath výrazy. Predikát nemusí být typu Boolean, nicméně je do něho konvertován, např. pomocí: //kapitola[nadpis] se vyberou uzly odpovídající kapitolám, které mají nadpis. K dispozici je také jednoduchá aritmetika, v predikátech lze využívat funkce a agregační funkce jako např. count a sum. Více pozornosti zaslouží porovnávací operátory = a!=. Porovnávat lze totiž množiny uzlů, resp. množinu uzlů s číslem, řetězcem nebo hodnotou typu Boolean. Při porovnání uzlů se porovnává jejich řetězcová hodnota. Někdy může nastat poněkud neintuitivní situace. Např. porovnání: hodnota = množina-uzlů se vyhodnotí jako splněná podmínka, jestliže množina-uzlů obsahuje nějaký uzel řetězcovou hodnotou, která se shoduje s hodnotou hodnota. Naopak: hodnota!= množina-uzlů bude true, jestliže množina-uzlů obsahuje nějaký uzel s řetězcovou hodnotou, která se neshoduje s hodnotou hodnota. Z toho plyne, že oba výrazy mohou být vyhodnoceny současné jako true! Predikáty lze skládat pomocí běžných Booleovských operátorů and, or a not(). Jakékoliv relativní cesty vyskytující se v predikátu jsou uvažovány relativně ke kontextu danému krokem, který předchází predikát: /kniha[@třída="h.3.3" and autor="jiří Kosek"] Každá cesta začíná v nějakém počátečním bodě modelu XML dat. Cesta, která je ve výrazu uvozena znakem /, reprezentuje absolutní cestu, která vždy začíná v kořenovém uzlu. Absolutní cesta může vybrat více než jeden element. Dotaz / zřejmě vybírá celý dokument. Cesta začínající // může vést kdekoliv v dokumentu. Např. výraz: 5

//kniha[autor="jiří Kosek"]/titul označuje tituly knih daného autora, umístěné kdekoliv v dokumentu. Jiný příklad: kapitola[sekce]//nadpis označuje nadpisy sekcí všech kapitol. Cesta, která nezačíná /, reprezentuje relativní cestu začínající z běžného (kontextového) uzlu. Flexibilitu vyjadřování v XPath podporuje zástupný znak *. Znamená všechny elementy v daném kroku. Např.: //kniha/descendant::* -- dává všechny potomky každého elementu kniha //parent::* Ne zcela triviální je výraz: -- dává všechny elementy, které jsou rodičem nějakého uzlu (tj., listy stromu nebudou ve výsledku) obrázek/ancestor::kapitola/following-sibling::kapitola Jedná se o kapitolu, která je za nějakou kapitolou obsahující obrázek. V testech a predikátech můžeme používat rozmanité funkce. Jsou to funkce pro práci s primitivními datovými typy, ale i funkce pro práci s kolekcemi např. count() je funkce, vracející počet prvků argumentu, position() hledá prvek na nějaké pozici. Pro práci s řetězci lze využívat např. funkce string(exp), concat(), starts-with(). Uvažme několik příkladů: //book[@year = 2001 ] -- všechny knihy vydané v roce 2001 /books/book/author[position()=1] nebo zkráceně /books/book/author[1] //book[starts-with(title, Java Programming )]/author[1] -- první autor knih (o programování v Javě) self::node() -- jméno kontextového uzlu. Jak jsme se již zmínili dříve, výsledkem vyhodnocení výrazu XPath je číslo, Booleovská hodnota, řetězec, nebo množina či posloupnost uzlů. Pouze výrazy XPath založené na pojmu cesta označují dotazy. Jak již název jazyka napovídá, cesty v XPath mají výsadní postavení. Jde o zásadní konstrukt jazyka, který se objevuje i v dalších dotazovacích jazycích nad XML daty. Jednoduchá cesta specifikuje jeden krok v navigaci v modelu XML dat. Cesta je seznam jednoduchých cest (kroků), přičemž každý její krok je vyhodnocen v rámci nějakého kontextu. Je-li výsledkem kroku množina uzlů, v řeči XPath kontextová množina uzlů, vstupují tyto uzly jako kontext do následujícího kroku. Vznikající množiny uzlů se v každém kroku sjednocují. Např.: /books -- absolutní cesta, která vrací uzel odpovídající elementu books book/title -- relativní cesta, jejímž výsledkem jsou všechny nadpisy kapitol, které jsou dítětem běžného uzlu //title -- vybere každý element title, který se vyskytuje v dokumentu 3 Jazyk XPointer Smyslem jazyka XPointer [7] je možnost označit místo nebo oblast v XML dokumentu. Potřebujeme to např. tehdy, chceme-li se odkázat na nějaký prvek z jiného dokumentu. Pomocí výrazů jazyka XPath umíme označit cestu v XML dokumentu. Zkombinujeme-li toto označení s identifikací XML dokumentu, dostaneme jednoznačný odkaz na pozici v XML dokumentu. Podstatné je zde použití identifikátorů URI (Uniform Resource Identifier), které označují a lokalizují zdroje. XPointer přidává k tomuto označení výrazy jazyka XPath, který označíme pozici v tomto zdroji. Identifikátorem URI lze obecně označit zdroj, aniž by lokalizoval jeho uložení (je to prostě pouhý jednoznačný identifikátor). v případě výrazů jazyka XPointer je samozřejmě omezen pouze na XML zdroje, neboť jenom v tom případě má navigace přes XPath smysl. XPointer lze charakterizovat jako jednoduchý jazyk pro identifikaci fragmentů XML dokumentů. Jde vlastně o relativní adresování, které rozšiřuje možnosti vazby přes návěští známé z HTML. Pomocí výrazů jazyka XPointer lze vazby specifikovat k místům bez návěští a také k podřetězcům a částem XML stromů. 6

Obecná syntaxe výrazu v XPointer je velmi jednouchá: výraz_v_xpointer ::= jméno posloupnost_dětí úplný_výraz Nejčastěji používaný tvar výrazu v jazyce XPointer připomíná volání funkce s argumentem typu výraz v jazyce XPath : xpointer( výraz v jazyce XPath ) Ve spojení s konkrétním URL např. můžeme uvažovat výraz: http://kocour.ms.mff.cuni.cz/tam.xml#xpointer(/článek/sekce[6]) který identifikuje šestou sekci článku umístěného v souboru tam.xml na adrese http://kocour.ms.mff.cuni.cz/. Části zápisu za znakem # se říká identifikátor fragmentu. Dlužno připomenout, že obecně lze uvést několik takových výrazů za sebou: xpointer( výraz v jazyce XPath ) + Výsledkem jsou pak všechny možné kombinace jednotlivých složek. Místo pseudofunkce xpointer lze použít i jiná rozšíření XPath. Pomocí výrazů XPointer lze lokalizovat např. element s daným ID (pomocí funkce id() z XPath), všechny elementy, které mají jistý atribut, n-tý element jistého typu, pro dané n, m-tého potomka n-tého elementu, pro daná n a m, a řadu dalších kombinací těchto možností. Nejjednodušším výrazem XPointer je pouhé jméno, což představuje zkratku za id(jméno). Výsledkem je element, jehož ID je jméno. Jinou možností je použít navigační posloupnost. Ta vybírá posloupnost uzlů elementů navigací v v modelu XML dokumentu. Jde vlastně o případ cesty v XPath, kdy je využívána pouze osa child. Posloupnost čísel elementů označujících cestu (např. /1/5/2) znamená, že z kořenového elementu se přejde na 5. podelement a z něho na 2. podelement. Následují příklady zahrnující úplné výrazy v XPointer. xpointer(/) -- označuje celý dokument xpointer(/child::lidé/child::osoba[@id=480423016]) V možných scénářích, jak využít jazyk XPointer, si můžeme např. představit situaci, kdy vybereme myší fragment XML textu a software využívající XPointer vygeneruje odpovídající identifikátor tohoto fragmentu XML dokumentu. 4 Jazyk XLink Jazyk HTML nabízí možnost vkládat do dokumentu hypertextové odkazy. Funkčnost odkazu v HTML má ovšem své hranice. URL většinou ukazují na celý dokument a dostat se k části textu vyžaduje ručně vkládat návěští do místa odkazu v cílovém souboru. Dalším nedostatkem může být fakt, že vazby pomocí HTML jsou pouze jednosměrné. Stopu odkazování lze sice uložit, nicméně zevnitř HTML nelze zjistit, odkud je na dokument odkazováno. Jazyk XLink [9] rozšiřuje netypované href vazby v HTML. Umožňuje vícesměnná spojení mezi zdroji (nejen tam i zpět) a propojení k libovolným pozicím v dokumentu (pomocí URI a XPointer). XLink (XML Linking Language) definuje spojení (vazbu) mezi dvěma nebo více zdroji. Oba jazyky XLink a XPointer se někdy souhrnně označují XLL. Jazyk XLink slouží pro specifikaci typovaných vazeb mezi XML dokumenty. Vazba v XLink je explicitní vztah mezi několika zdroji nebo jejich částmi. Vazba se zapisuje pomocí tzv. vazebního elementu (ve smyslu XML), bližší informace o vazbě se provádí pomocí jistých atributů. Jinými slovy, vazbu do dokumentu přidáme tak, že k některému elementu přidáme speciální atributy, které vazbu popisují. Deklarace vazby vyžaduje především určit její typ atributem type. Ten může nabývat několika hodnot. Pomocí typu simple a extended rozlišujeme vazby jednouché resp. vazby rozšířené. 7

Jednoduché vazby jsou podobné vazbám používaným v HTML. Jsou jednosměrné a spojují dva zdroje jeden lokální a jeden vzdálený. Rozšířená vazba může zahrnovat více zdrojů než dva. XML element se nazývá vazební v XLink, jestliže má atribut type a dodržuje jistá omezení daná jazykem XLink (požaduje např. specifikaci prostoru jmen xlink). v jazyce HTML lze lokální odkazy realizovat pomocí elementu <a>. Odkaz má tvar: <a href= #nav >, odkazované návěští je vyznačeno pomocí elementu <a name= nav >. Podobný mechanizmus lze v jazyce XLink realizovat tzv. jednoduchou vazbou. Např. vazebním elementem refr specifikujeme vazbu se dvěma konci, s jedním lokálním (implicitním) a jedním vzdáleným zdrojem. <refr xlink:type= simple xlink:href= http://www.w3.org/ >The W3C</refr> V dalším příkladu vazebního elementu ukážeme popis pomocí atributu title, který určuje blíže obsah lokálního zdroje. Tato informace může sloužit aplikaci a nemusí být viditelná uživateli. Atribut role blíže popisuje účel vazby. Je zřejmé, že v případě existence jakéhokoliv schématu pro XML dokument, musí být tyto atributy odpovídajícím způsobem deklarovány. <autor xmlns:xlink:type =... xlink:href= http://kocour.ms.mff.cuni.cz/ xlink:title= Honzova domácí stránka xlink:role= další informace o autorovi >Honza </autor> Rozšířené vazby mají informace o zdrojích umístěny do podelementů vazebního elementu. Jako příklad složitější vazby v XLink specifikujme vazbu se dvěma konci a se dvěma vzdálenými zdroji: <družba xml:link type= extended > <holandsky xml:link type= locator href= http://www.klm.nl/about/nederlands/default.htm /> <anglicky xml:link type= locator href= http://www.klm.nl/about/default.htm /> Dvoujazyčné párování informací na Webu </družba> Lze dokonce vyjádřit více hran (vícesměrnost) v rámci jedné vazby. To souvisí s procházením participujících zdrojů v dané vazbě. U rozšířených vazeb je možné iniciovat procházení z jakéhokoliv participujícího zdroje, zatímco u jednoduché vazby pouze z lokálního. Další možnosti využití jazyka XLink je vnitřní svázání posloupnosti prvků v rámci jednoho lokálního zdroje: <slide> <zpět xlink:type= simple xlink:href= xpointer(ancestor::slide/ preceding-sibling::slide[position()=1]) > na předchozí</zpět> <dopředu xlink:type= simple xlink:href= xpointer(ancestor::slide/ following-sibling::slide[position()=1]) > na další</dopředu> </slide> 5 Dotazovací jazyk XQuery Pro účely dotazování nad XML daty a databázemi vytvořilo konsorcium W3C specifikaci dotazovacího jazyka XQuery [1] (používá se také označení XML Query). První použitelná verze specifikace tohoto jazyka byla uveřejněna v květnu 2003, v době přípravy tohoto příspěvku byla aktuální verze z roku 2005, některé dodatky rozšiřující XQuery o možnost modifikace (XQuery Update Facility) jsou datovány v lednu 2006. V současné době zahrnuje specifikace XQuery asi 15 dokumentů, od popisu modelu dat, syntaxe dotazů, až po specifikaci funkcí, operátorů, nebo specifikaci prostředků pro manipulaci s XML daty. 8

XQuery je funkcionální jazyk vybudovaný nad jazykem XPath. Výrazy jazyka XPath používáme v XQuery pro dotazy nad XML dokumenty. Výsledkem dotazu je sada nebo posloupnost uzlů, ze kterých budeme chtít zkonstruovat výstup dotazu. Proto potřebujeme v jazyce XQuery konstrukty, které dovolují vytváření elementů, zejména v souvislosti s daty získanými dotazem. Důležitým konstruktem jazyka XQuery jsou proměnné. Označujeme je identifikátory s prefixem $, např. $book. Proměnné nesou hodnoty během zpracování, lze se na ně odkazovat ve výrazech, např. avg($book/price) vypočte průměrnou cenu knihy. 5.1 Struktura dotazu v XQuery Dotaz v jazyce XQuery má dvě části prolog a tělo dotazu (body). Prolog slouží k zavedení jmenných prostorů, pro import modulů, definici schématu a funkcí, deklaraci globálních proměnných. Tělo dotazu je výraz, jehož hodnota v prostředí definovaném prologem představuje výstup dotazu. Uvažme jednoduchý příklad dotazu, kterým chceme nalézt ve vstupním dokumentu knihu (element book) a vytvořit výstupní element (označený značkou result), který bude obsahovat název a autora knihy. Označme si název knihy jako proměnnou $b a autora jako proměnnou $a. Výstup může vypadat např. takto: <result> <book>$b</book> <author>$a</author> </result> Do tohoto výstupu musíme ale dosadit nalezené tituly a autory. Na to slouží v jazyce XQuery konstrukce nazývaná FLWOR (čti flauvr, tedy zvukově stejně jako květina flower ). Tato zkratka znamená For, Let, Where, Order-By, Return a je obdobou příkazu SELECT jazyka SQL. Složky FLWOR jsou ovšem zapsány obráceně. for $b in //book let $a = $b/author return <result> <book>$b</book> <author>$a</author> </result> Výraz //book označuje libovolný element typu book v probíraném XML dokumentu. Pokud potřebujeme, aby se některá část výrazu vyhodnotila, použijeme složené závorky. Např. výraz: <book>{$b/title}</book> označuje element book, jehož obsahem bude potomek title aktuálního obsahu proměnné b. Podobně, následující výraz: <result> <book>$b</book> <author>$a</author> </result> představuje element result, jehož obsahem budou elementy book a author, naplněné obsahem odpovídajících proměnných. Výraz FLWOR má obecně gramatiku: flwor_exp ::= (for_exp let_exp)?... where_exp? order_ by? return_exp kde hlavičkou je některý z následujících výrazů: for_exp ::= FOR var IN exp [, var IN exp] let_exp ::= LET var := exp [, var := exp] Klausule where obsahuje výraz chápaný jako podmínka, která slouží k omezení na případy, kdy aktuální prostředí splňuje tuto podmínku. Klausulí order by lze stanovit uspořádání výstupu 9

( ascending nebo descending ). Konečně klausule return obsahuje výraz, který slouží pro konstrukci výstupu. Klausule let slouží pro navázání hodnoty proměnné. Např. následující konstrukce: let $x := (1 to 5) return <test>{$x}</test> vygeneruje výsledek: <test>1 2 3 4 5</test> 5.2 Příklady dotazů v jazyce XQuery Uvažme jako příklad situaci, kdy potřebujeme nalézt názvy knih vydaných v roce 2003: for $b in doc( books.xml )//book where $b/@year = 2003 return <book>{$b/title}</book> V jazyce XPath by se téhož dosáhlo dotazem: doc( books.xml )//book[@year = 2003 ]/title Jako další příklad uvažme situaci, kdy potřebujeme nalézt názvy všech knih pro každého autora: let $b := doc( books.xml )/books/book for $a in distinct($b/author) return <author name= {$a} > {$b[author = $a]/title} </author> Potřebujeme-li podmínit výstup dotazu, můžeme použít konstrukci if then else. Např. můžeme ohodnotit ceny knih v souboru books.xml dle své představy normální či vysoké ceny: <result> {for $b IN doc( books.xml )//book return <book> <title>{b$/title}</title> {if $b/price > 1500 then <price>high</price> else <price>normal</price>} </book> } </result> Jazyk XQuery obsahuje také kvantifikátory some (existenční) a every (univerzální). Chceme-li např. vybrat tituly knih, které mají více než jednoho autora a jeden z nich se jmenuje Jan, můžeme použít kvantifikovaný výraz: for $b in doc( books.xml )//book where count($b/author) > 1 and some $a in $b/author satisfies $a/first = Jan return $b/title Uvažme ještě příklad, kdy chceme ze vstupního dokumentu vybrat všechny tituly knih a vytvořit z nich seznam v HTML: <html> <body><h1>seznam</h1> <ul>{ for $x in doc("books.xml")/bookstore/book/title order by $x return <li>{data($x)}</li> }</ul> </body> </html> 10

6 Závěr Ukázali jsme základní principy dotazovacích jazyků z rodiny XML, které podporuje konsorcium W3C. Tyto jazyky spolu navzájem úzce souvisí, za základ se obvykle považuje jazyk XPath. XPath je deklarativní jazyk sloužící pro alokaci uzlů a fragmentů v XML stromech. K alokaci zdrojů je zaveden jazyk XPointer. Ten využívá univerzální identifikace XML zdrojů pomocí URI, kterou doplňuje o výraz v XPath, popisujícího odkazovaný fragment dokumentu. Vedle zmíněného použití pro adresaci v XPointer se XPath dále používá v XSLT (pro porovnání vzorů), v jazyku XML Schema (pro popis jednoznačnosti a rozsahů) a v jazyku XQuery (pro selekci a iteraci). Jazyk XLink zobecňuje pojem vazby z HTML a zavádí do XML další, vyšší stupeň abstrakce. I když nejde přímo o hypertext, získáváme složitější datové struktury než samotně XML dokumenty. Existují ovšem i jisté problémy odrážející stav vývoje jazyků. v době psaní tohoto textu např. žádný obecný webový prohlížeč ani jiné aplikace nepodporovaly libovolné vazby v XLink, nebo nemusí být vazby implementovány konzistentně. Na závěr byl ilustrován princip jazyka XQuery, který představuje zatím nejucelenější dotazovací jazyk, navrhovaný konsorciem W3C pro dotazování nad XML daty a dokumenty. Literatura [1] Boag, S. et al.: XQuery 1.0: An XML Query Language, W3C Candidate Recommendation, 03 November 2005. Dostupné na: http://www.w3.org/tr/xquery/. [2] Bray, T. et al.: Extensible Markup Language (XML) 1.0 (Third Edition), W3C Recommendation, 04 February 2004. Dostupné na: http://www.w3.org/tr/rec-xml/. [3] Bray, T. et al.: Extensible Markup Language (XML) 1.1. W3C Recommendation 15 April 2004. Dostupné na: http://www.w3.org/tr/xml11/. [4] Clark, J., DeRose, S.: XML Path Language (XPath) Version 1.0, W3C Recommendation 16 November 1999. Dostupné na: http://www.w3.org/tr/xpath/. [5] Cowan, J., Tobin, R.: XML Information Set (Second Edition). W3C Recommendation 4 February 2004. Dostupné na: http://www.w3.org/tr/xml-infoset/. [6] Fernández, M. et al.: XQuery 1.0 and XPath 2.0 Data Model (XDM). W3C Candidate Recommendation 3 November 2005. Dostupné na: http://www.w3.org/tr/xpath-datamodel/. [7] Grosso, P. et al.: XPointer xpointer() Scheme. W3C Recommendation 25 March 2003. Dostupné na: http://www.w3.org/tr/xptr-xpointer/. [8] Mlýnková, I, Pokorný, J., Richta, K., Toman, K, Toman, V.: Technologie XML. In: Europen 2004, Dolní Morava 2004. Dostupné na: http://www.europen.cz/anot/24/sneznik.pdf [9] Walsh, N. et al.: XML Linking Language (XLink) Version 1.0, W3C Recommendation 27 June 2001. Dostupné na: http://www.w3.org/tr/xlink/. Summary This paper briefly describes languages XPath, XPointer, XLink and XQuery. The basic principles of these languages are explained on small examples. Due to the lack of space, the only fundamental constructions are elaborated. 11