XQuery | |
Paradigma | XML |
Megjelent | 2007 |
Fejlesztő | World Wide Web Consortium |
Operációs rendszer | platformfüggetlen |
Weboldal |
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 erősen típusos és Turing-teljes.
A fejlesztésében (akárcsak a Quiltében) részt vett Donald D. Chamberlin.
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]
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.
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ő:
Az XQueryben a változók előtagja $.
Sorozatok szerkesztése:
Közvetlen XML-konstrukció állandó elemnevekkel („direct constructors”):
<html> <head> { $page/head/content() } </head> <body bgcolor={ $style/bgcolor/text() } > { $page/body/content() } </body> </html>
„Computed 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.
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).
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/descending return <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ő.
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ó.
Egyenletek, adatok számítására és az adatmodell sorozatainak módosítására használatosak.
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.
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:
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
.
Minden question XML-elem számlálása a célban:
fn:count(//question)
Összetettebb példa, mely minden dokumentum minden kérdését listázza, ahol 2-nél kevesebb válasz van:
<noanswerquestions>{
for $s in fn:doc("lpi101.edugallery")//server/@address
for $d in fn:doc($s)[count(.//question/(true, false)) <= 1]
return <doc src="{ $s }">{
$d//question[count((true, false)) <= 1]
}</doc>
}</noanswerquestions>
Egy további példa (az XQueryn keresztül történő indirekt átstrukturálás lehetőségeit mutatja meg):
<?xml version="1.0" encoding="ISO-8859-1"?>
<partlist>
<part partid="0" name="car"/>
<part partid="1" partof="0" name="engine"/>
<part partid="2" partof="0" name="door"/>
<part partid="3" partof="1" name="piston"/>
<part partid="4" partof="2" name="window"/>
<part partid="5" partof="2" name="lock"/>
<part partid="10" name="skateboard"/>
<part partid="11" partof="10" name="board"/>
<part partid="12" partof="10" name="wheel"/>
<part partid="20" name="canoe"/>
</partlist>
<parttree>
<part partid="0" name="car">
<part partid="1" name="engine">
<part partid="3" name="piston"/>
</part>
<part partid="2" name="door">
<part partid="4" name="window"/>
<part partid="5" name="lock"/>
</part>
</part>
<part partid="10" name="skateboard">
<part partid="11" name="board"/>
<part partid="12" name="wheel"/>
</part>
<part partid="20" name="canoe"/>
</parttree>
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>
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.