XQuery

XQuery
ParadigmaDeklarativní, funkcionální, modulární
VývojářW3C
První vydání23. ledna 2007
Poslední verzeXQuery 3.1 - 21. března 2017
Hlavní implementaceVíce implementací
Ovlivněn jazykyXPath, SQL, XSLT
WebW3C XML Query
Přípona souboru.xq, .xql, .xqm, .xqy, .xquery

XQuery (XML Query) je dotazovací a funkcionální programovací jazyk, který dotazuje a transformuje kolekce strukturovaných či nestrukturovaných dat vyskytujících se nejčastěji v podobě XML, textu či s rozšířeními specifickými pro dodavatele pro jiné datové formáty (JSON, binární formát, atd.). Jazyk je vyvíjen pracovní skupinou XML Query W3C. Práce je úzce koordinována s vývojem XSLT, jímž se zabývá pracovní skupina XSL. Obě zmíněné pracovní skupiny W3C pak sdílejí odpovědnosti za XPath, který lze označit za podmnožinu XQuery.

V současné době pak můžeme dohledat několik standardů W3C. Nejstarším z nich je XQuery 1.0, který se stal standardem W3C 23. ledna 2007.[1] Poté 8. dubna 2014 se stalo standardem W3C XQuery 3.0.[2] Posledním známým standardem W3C je XQuery 3.1, který se stal doporučením W3C 21. března 2017.[3]

Poslání XQuery je možno obsáhnout citací J. Robieho:

„Posláním projektu XML Query je poskytovat flexibilní možnosti dotazů pro extrakci dat ze skutečných a virtuálních dokumentů v síti World Wide Webu, a tím konečně zajistit potřebnou interakci mezi světem webu a světem databází. Nakonec budou kolekce souborů XML přístupné jako databáze.“[4]

Charakteristika

XQuery je funkcionální programovací jazyk bez vedlejších účinků zaměřený na výraz s jednoduchým typovým systémem, jenž je shrnován Kilpeläinenem:

„Všechny výrazy XQuery fungují na sekvencích, a vyhodnocují se na sekvence. Sekvence jsou seřazené seznamy položek. Položky mohou představovat jak uzly, které představují komponenty dokumentů XML, tak atomické hodnoty, které jsou instancemi základních typů XML Schématu, jako je xs:integer, nebo xs:string. Sekvence mohou být také prázdné, nebo se skládat pouze z jedné položky, přičemž rozdíl mezi jednou položkou a singletonovou sekvencí se nerozlišuje. (...) Sekvence XQuery / XPath se liší od seznamů v jazycích Lips či Prolog tím, že vylučují vnořené funkce. Návrháři XQuery nejspíše považovali vnořené funkce za zbytečné pro manipulaci s obsahem dokumentu. Vnoření, nebo hierarchie struktur dokumentů je místo toho reprezentována uzly a jejich vztahy potomek-rodič.“[5]

XQuery poskytuje prostředky pro extrakci a manipulaci s daty XML dokumentů, nebo jakýkoliv datových zdrojů, které se mohou být zobrazovány v podobě XML. Typickým příkladem těchto zdrojů jsou relační databáze[6] nebo kancelářské dokumenty.

XQuery spojuje možnosti jazyka XPath s jednoduchými transformacemi a operacemi známými z SQL. XPath je využíván k adresování specifických částí XML dokumentů. Toto adresování pak doplňují již zmíněné SQL výrazy známé pod názvem FLWOR, které umožňují lepší zpracování “join“ příkazů. Výraz FLOWR je tvořen z pěti klauzulí, z jejichž počátečních písmen vznikl jeho název. Jedná se o klausule:

  • FOR – Slouží k výběru posloupnosti uzlů, které mají být zpracovány.
  • LET – Využívá se k přiřazení proměnné pro každý prvek posloupnosti.
  • WHERE – Umožňuje filtrování uzlů posloupnosti, dle určité podmínky.
  • ORDER BY – Příkaz se využívá k seřazení vybraných (případně odfiltrovaných) uzlů.
  • RETURN – Je využíván ke specifikaci výstupů pro každý vybraný (případně odfiltrovaný) uzel.[7]

Mimo jazyka XPath a SQL byl tento jazyk inspirován i XSLT transformačním jazykem. XQuery tedy umožňuje mimo jiné také vytváření nových dokumentů s předem definovanou strukturou a možností vytváření nových elementů.

Jazyk je založen na datovém modelu XQuery a XPath (XDM). Tento model využívá stromově strukturovaný model informačního obsahu dokumentu XML, který může obsahovat sedm druhů uzlů: uzly dokumentu, elementy, atributy, textové uzly, komentáře, pokyny ke zpracování a jmenné prostory. XDM modeluje všechny hodnoty jako sekvence. Singletonová hodnota je pak považována za sekvenci o délce jedna. Položky v sekvenci mohou být jak uzly XML, tak i atomické hodnoty. Pod atomickými hodnotami si můžeme představit například integer, string, či boolean. Úplný seznam všech možných atomických hodnot je pak založen na primitivních typech XML Schématu.

Funkce pro aktualizaci XML dokumentů, nebo databází, či schopnost fulltextového vyhledávání nejsou součástí základního jazyka. Tyto funkce jsou definovány v rozšiřujících standardech. Pro možnosti aktualizace je zapotřebí rozšíření „XQuery Update Facility 1.0“ a pro možnost fultextového vyhledávání v XML dokumentech je pak nutné zajistit si rozšíření „XQuery and XPath Full Text 1.0“[8]. V rámci verze XQuery 3.0 byla také přidána podpora úplného funkcionálního programování, jelikož ve funkcích se vyskytují hodnoty, s nimiž lze manipulovat (ukládání hodnot do proměnných, předávání hodnot funkcím vyššího řádu a jejich dynamického volání).

Příklady

Níže uvedená ukázka vrací v podobě HTML dokumentu neduplicitní seznam všech postav (řečníků) v každém aktu známé Shakespearovy hry Hamlet, jejíž text je uložen v dokumentu Hamlet.xml.

<html><body>
 {
   for $act in doc("hamlet.xml")//ACT
   let $speakers := distinct-values($act//SPEAKER)
   return
     <div>
       <h1>{ string($act/TITLE) }</h1>
       <ul>
       {
         for $speaker in $speakers
         return <li>{ $speaker }</li>
       }
       </ul>
     </div>
 }
 </body></html>

Všechny konstrukce XQuery pro provádění výpočtů jsou výrazy. Neexistují žádné konkrétní příkazy, i když některá klíčová slova mohou naznačovat přítomnost příkazů. K provedení funkce je vyhodnocen výraz v jejím těle a je vrácena jeho hodnota. V níže uvedeném příkladu pak lze nalézt zápis funkce pro zdvojnásobení vstupní hodnoty.

declare function local:doubler($x) { $x * 2 }

Pro jednoduché vypsání dotazu v podobě „Hello World“ stačí napsat výraz níže.

"Hello World"

Tento styl je běžný ve funkcionálních programovacích jazycích.

Srovnávání XQuery a XSLT

Rozsah

Ačkoliv XQuery bylo původně vyvíjeno jako dotazovací jazyk pro velké sbírky dokumentů XML, je také schopno transformovat jednotlivé dokumenty. Jeho funkce se tedy překrývají s XSLT, který byl navržen výslovně za účelem umožnění transformování vstupních dokumentů XML do HTML nebo jiných formátů.

Standardy XSLT 2.0 a XQuery byly sice vyvinuty samostatnými pracovními skupinami v rámci W3C, avšak ve vhodných případech společně zajistili společný přístup. Sdílejí pak také stejný datový model (XSD), typový systém a knihovnu funkcí. Společně pak oba využívají jazyk XPath 2.0.

Silné a slabé stránky

Studie použitelnosti prokázaly, že XQuery je pro uživatele lépe naučitelné, zejména pak pro takové uživatele, kteří již mají nějaké předchozí zkušenosti s databázovými jazyky jako je SQL.[9] To lze připsat skutečnosti, že XQuery je méně rozsáhlý jazyk s menším počtem konceptů k učení a skutečnosti, že programy jsou stručnější. Pravdou také zůstává, že XQuery je více ortogonální jazyk, jelikož lze jakýkoliv výraz použít v jakémkoliv syntaktickém kontextu. Naopak XSLT je dvoujazyční systém, ve kterém lze do XSLT instrukcí vnořit výrazy XPath, ale ne naopak.

XSLT je aktuálně silnější než XQuery pro aplikace zahrnující provádění malých změn v dokumentu. Takové aplikace jsou obecně zpracovávány v XSLT pomocí kódovacího vzoru, který zahrnuje šablonu identity, jež kopíruje všechny uzly beze změny, upravené konkrétními šablonami, které upravují vybrané uzly. XQuery prozatím toto neumožňuje, avšak v budoucích verzích bude tento nedostatek řešen pomocí aktualizačních prostředků v jazyce, který je ve vývoji.[10]

XQuery 1.0 postrádá na rozdíl od XSLT jakýkoliv druh mechanismu pro dynamickou vazbu nebo polymorfismus. Tento nedostatek byl napraven až v XQuery 3.0. XSLT v této problematice nabízí dokonce dva doplňkové mechanismy. Prvním je dynamické přizpůsobování pravidel šablony a druhým schopnost přepsat pravidla pomocí importu. Absence tohoto druhu mechanismu u XQuery 1.0 byla však záměrným rozhodnutím, jelikož díky tomuto rozhodnutí je tato verze XQuery velmi dobře použitelná pro statickou analýzu, která je nezbytná pro dosažení potřebné optimalizační úrovně v databázových dotazovacích jazycích. Rovněž se tím usnadňuje i detekce chyb v kódu XQuery v průběhu kompilace.

Reference

  1. XML and Semantic Web W3C Standards Timeline-History. Scribd [online]. [cit. 2021-01-11]. Dostupné online. (anglicky) 
  2. XQuery 3.0: An XML Query Language. www.w3.org [online]. [cit. 2021-01-11]. Dostupné online. 
  3. XQuery 3.1: An XML Query Language. www.w3.org [online]. [cit. 2021-01-11]. Dostupné online. 
  4. Re: Action item on syntax-based interoperability from Jonathan Robie on 2003-10-25 (www-tag@w3.org from October 2003). lists.w3.org [online]. [cit. 2021-01-11]. Dostupné online. 
  5. KILPELÄINEN, Pekka. Using XQuery for problem solving. Software: Practice and Experience. 2012, roč. 42, čís. 12, s. 1433–1465. Dostupné online [cit. 2021-01-11]. ISSN 1097-024X. DOI 10.1002/spe.1140. (anglicky) 
  6. IBM Knowledge Center. www.ibm.com [online]. [cit. 2021-01-11]. Dostupné online. (anglicky) 
  7. XQuery. www.kosek.cz [online]. [cit. 2021-01-11]. Dostupné online. 
  8. XQuery and XPath Full Text 1.0. www.w3.org [online]. [cit. 2021-01-11]. Dostupné online. 
  9. GRAAUMANS, J.P.M. SIKS Dissertation Series. 2005-16. Dostupné online. 
  10. XQuery Update Facility 1.0. www.w3.org [online]. [cit. 2021-01-11]. Dostupné online. 

Externí odkazy