XQuery
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] Nyelvi elemekAz ú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. AdatmodellAz 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:
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:
XML-elemek felépítéseKö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 ( 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ésekFontos szerepük van az XQueryben a FLWOR-kifejezéseknek (ˈflaʊ.ə) Ez a 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 A A következő példában szerepel a 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 Összekötő operátorok és csoportosításokAz ö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 Elődefiniált függvényekEgyenletek, adatok számítására és az adatmodell sorozatainak módosítására használatosak. Felhasználó által megadott függvényekA 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átorokAz 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 ( PéldákMinden 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>
AlkalmazásaA 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] Implementációk
Jegyzetek
FordításEz 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. Források
|