Az XQuery (jelentése: XML Query Language) a W3C által meghatározott lekérdezési nyelv XML-adatbázisokhoz. Célja részletek keresése nagy XML-adatbázisokból. Ezzel szemben az XSLT célja teljes XML-dokumentumok átalakítása.
Az XQuery XSLT-n, SQL-en és C-n alapuló szintaxist használ, és XPatht és XML-sémát használ adatmodelljéhez és függvényeihez. Az XQL-ből, az XML-QL-ből és a Quiltből vett át számos ötletet.
Az XQuery 1.0 2007. január 23-án,[1] az XQuery 3.0 2014. április 8-án,[2] az XQuery 3.1 2017. március 21-én vált W3C-ajánlássá.[3]
Nyelvi elemek
Az útkifejezéseken kívül (XPath) számos további nyelvi jellemző van, melyek a következő szakaszokban rövid példákkal együtt szerepelnek.
Adatmodell
Az XQuery alapvető adatszerkezete egy sorozat, mely egy 0 vagy több elemből álló rendezett lista. Egy sorozat lehet XML-dokumentum. A sorozatok jellemzően zárójelek közt vannak, és duplikátumokat is tartalmazhatnak. A sorozatok nem ágyazhatók egymásba.
Az alábbi sorozatok azonosak:
(1, 2, 1) és (1, (2, 1))
(1, (), ) és (1, )
(<A/>) és <A/>
Az XQueryben a számosságok lekérdezésére az alábbi hat függvény elérhető:
fn:zero-or-one($seq)
fn:one-or-more($seq)
fn:exactly-one($seq)
fn:empty($seq)
fn:exists($seq)
fn:count($seq)
Az XQueryben a változók előtagja $.
Sorozatok szerkesztése:
A vesszőoperátor két sorozatot fűz össze egymás mögött
Értékek hozzáadása az fn:insert-before függvénnyel történik
Értékek törlése az fn:remove függvénnyel történik
Az értéksorrend az fn:reverse függvénnyel fordítható meg
Az értékek átrendezése az fn:unordered függvénnyel történik
XML-elemek felépítése
Közvetlen XML-konstrukció állandó elemnevekkel („direct constructors”):
element html {
element head { $page/head/content() }
element body {
attribute bgcolor { $style/bgcolor/text() },
text { $page/body/content() }
}
}
XML-adatok felépítéséhez használható a direkt XML-írásmód és a „computed constructors” deklaratívabb konstrukció egyaránt. Mindkét esetben a kapcsos zárójelek ({…}) a további XQuery-kifejezések beágyazására szolgálnak.
Rendezési funkció (order by)
A relációs algebrával és az SQL-lel szemben az XML-adatelemek implicit megadott rendezéssel (document order) rendelkeznek. Minden XQuery-kifejezésnek be kell tartania e rendezést, kivéve ha a kifejezésben ez ki van kapcsolva (Ordering mode: unordered).
FLWOR-kifejezések
Fontos szerepük van az XQueryben a FLWOR-kifejezéseknek (ˈflaʊ.ə) Ez a for, let, where, order by, return rövidítése és az SQL (SELECT, FROM, WHERE) kifejezéseihez hasonlítanak. Az SQL-lel szemben a FLWOR-kifejezések nagybetűérzékenyek. Ezek szekvenciákat bontanak szekvenciákra (vö. adatmodell). A FLWOR-kifejezések formái az alábbiak:
for $forvar1 at $posvar1 in <Expr>, $forvar2 at $posvar2 in <Expr> …
let $letvar1 := <Expr>, $letvar2 := <Expr> …
where <BoolExpr>
order by <Expr> ascending/descendingreturn <Expr>
Itt az <Expr> tetszőleges XQuery-kifejezést, a <BoolExpr> boolean típusú kifejezést jelent. A for-szerkezetek a $forvar1, $forvar2… változókat sorozatban rendelik hozzá az <Expr> szekvenciából. Az at kulcsszóval a korábbi változó értéke hozzárendelhető pozíciós változóval, ahol a számozás 1-nél kezdődik. Ezzel szemben a let-szerkezetek a $letvar1, $letvar2… változókat a hozzá tartozó kifejezés egész eredményéhez kötik. Az így létrejövő listasorozat a hozzárendelések minden lehetséges kombinációját tartalmazza, melyek a for- és let-változókból létrehozhatók.
A where-szerkezet a nem kívánt listákat kerüli el. Egy boolean kifejezés a for- és let-szerkezetekhez kapcsolt változók legalább egyikéhez kapcsolódik. Ugyanez teljesül az order by-szerkezetre is, amely a sorozatokat rendezi. A return-szerkezet a kívánt változókat adja, lehetőleg direkten vagy indirekten létrehozott változókba ágyazva. Komplex esetekben a FLWOR-kifejezések egymásba ágyazhatók, vagyis az <Expr> előfordulási helyén egy FLWOR-kifejezés is állhat.
A következő példában szerepel a for és a let használata. A for-rész kiválaszt minden bekezdést egy HTML-oldalon (<p> elemek), a let rész előre definiált függvények segítségével kiadja a szószámukat. Végül minden nem üres bekezdést (szószám > 0) nagyságukkal együtt kiadja a kód.
for $par in $page//p
let $words := fn:count(fn:tokenize($par/content(), " \n\t"))
where $words gt 0
return <p>
{$par/content()}<br/>
Size: { $words }
</p>
E kifejezésben észrevehető, hogy a for- és a let-rész egymástól függ, mivel a for-részben definiált $par változót használja a let-rész. Ez azt jelenti, hogy a let-rész a $par minden definiálásakor újra kiértékelendő.
Összekötő operátorok és csoportosítások
Az összekötő műveletek (angolul: join) két bemeneti halmazból és egy ezt követő kiválasztásból álló direkt szorzatot eredményeznek (vö. relációs algebra). Például a FLWOR-kifejezésekről szóló szakaszban egy ilyen művelet szerepelt. A for és a let részekben definiált változók összekötése a bemeneti halmazokat direkt szorzatuk azon részhalmazává alakítja, ahol a where kiválasztási feltételei alkalmazva lettek. Mivel a kiválasztási feltételek a kifejezés where és az alkifejezések for és let részeiben is előfordulhatnak, a kifejezés kiértékelése előtt szükséges a normalizáció.
Elődefiniált függvények
Egyenletek, adatok számítására és az adatmodell sorozatainak módosítására használatosak.
Felhasználó által megadott függvények
A declare function révén hozhat létre a felhasználó függvényeket. Az általános forma a következő:
declare function namespace:függvénynév
($parameter1 as adattípus1, $parameter2 as adattípus2, …) as kimenettípus {
<XQuery-kifejezés>
}
A függvények más függvényeket és saját magukat is meghívhatják rekurzívan, így az XQuery Turing-teljes.
Összehasonlító operátorok
Az XQueryben kétféle összehasonlító függvény van: az értékminősítő és a létezésminősítő. Az értékminősítők más nyelvek megfelelő operátoraihoz hasonlítanak. Az alábbi operátorok léteznek:
eq: Egyenlőség (equal)
ne: Egyenlőtlenség (not equal)
lt: Kisebb (less than)
gt: Nagyobb (Greater than)
le: Kisebb vagy egyenlő (Less or equal)
ge: Nagyobb vagy egyenlő (Greater or equal)
A leggyakoribb összehasonlító műveletek (=, !=, <, >, <=, >=) egzisztenciális összehasonlítást végeznek. Így az operátor bal és jobb oldalán is állhatnak sorozatok. A seq1 OP seq2 akkor igaz, ha seq1-nek van e1, seq2-nek pedig e2 eleme, ahol e1 OP e2, és OP az=, !=, <, >, <= vagy >= operátorok egyike. Így (1, 2) > (3, 0) igaz, mivel 1 > 0.
declare function local:one_level ($p as node()) as node()
{
<part partid="{$p/@partid}" name="{$p/@name}">
{
for $s in doc("data/parts-data.xml")//part
where $s/@partof =$p/@partid
return local:one_level($s)
}
</part>
};
<parttree>
{
for $p in doc("data/parts-data.xml")//part [empty(@partof)]
return local:one_level($p)
}
</parttree>
Alkalmazása
A relációs adatbázisokban az XML és történelmileg nagyobb adatkészletek szüksége miatt a nemzetközi szabványügyi szervezet az SQL egy kiterjesztését dolgozta ki, az XML és az SQL lehetőségeit kombináló SQL/XML-t. Az XML-adatoknak az XMLQuery SQL-függvényben való lekérdezésére használt nyelvet elnevezték XQuerynek.[4]
Ez a szócikk részben vagy egészben a XQuery című német Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.