XQuery
XQuery | |
---|---|
Paradigme : | XML |
Anul publicării: | 2005 |
Dezvoltator: | Consorțiul World Wide Web |
Versiunea curentă : | 3.1 (21 martie 2017) |
Tastare : | puternic |
Implementări importante : | BaseX , EXist (baza de date) , Galax, Saxon , Pathfinder, XQilla, Zorba |
Standardizări: | Specificații W3C |
Influențată de: | XQL , XML-QL , Quilt |
Sistem de operare : | platforma independenta |
w3.org |
XQuery înseamnă XML Query Language și se referă la un limbaj de interogare specificat de W3C pentru baze de date XML . Este folosit pentru a alege părți individuale din colecții mari de date XML . În schimb, XSLT este utilizat pentru a transforma documente XML întregi.
XQuery folosește o sintaxă bazată pe XSLT, SQL și C și folosește XPath și XML Schema pentru modelul său de date și biblioteca sa de funcții. A apărut din limbile XQL , XML-QL și Quilt .
XQuery este puternic tastat și Turing-complet .
Donald D. Chamberlin a fost implicat în mod semnificativ în dezvoltare (ca și în cazul Quilt) .
Elemente de limbaj
În plus față de expresiile de cale ( XPath ), există o serie de alte proprietăți de limbă care vor fi explicate în secțiunile următoare folosind exemple scurte.
Modelul de date
Structura de bază a datelor în XQuery este o secvență. O secvență este o listă ordonată de zero, unul sau mai multe elemente. Prin urmare, o secvență poate fi și un document XML. Secvențele sunt de obicei între paranteze și pot conține, de asemenea, duplicate. Secvențele nu pot fi cuibărite.
Următoarele secvențe sunt identice:
-
(1, 2, 1)
și(1, (2, 1))
-
(1, (), )
și(1, )
-
(<A/>)
și<A/>
XQuery oferă șase funcții pentru interogarea cardinalităților pe secvențe:
- fn: zero-or-one ($ seq)
- fn: unul sau mai mulți ($ seq)
- fn: exact-unu ($ seq)
- fn: gol ($ seq)
- fn: există ($ seq)
- fn: count ($ seq)
În XQuery, variabilele sunt identificate cu un prefix $.
Editarea secvențelor
- Operatorul virgulă atârnă două secvențe una în spatele celeilalte
- Puteți adăuga valori cu funcția fn: insert-before
- Puteți șterge valori cu funcția fn: remove
- Puteți rearanja valorile cu funcția fn: invers
- Puteți rearanja valorile cu funcția fn: unordered
Construirea elementelor XML
Construcție XML directă cu nume de elemente constante („constructori direcți”):
<html> <head> { $page/head/content() } </head> <body bgcolor={ $style/bgcolor/text() } > { $page/body/content() } </body> </html>
„Constructori calculați”
element html { element head { $page/head/content() } element body { attribute bgcolor { $style/bgcolor/text() }, text { $page/body/content() } } }
Atât notația directă ca XML, cât și construcția mai declarativă folosind așa-numiții „constructori calculați” sunt disponibile pentru construirea datelor XML. În ambele cazuri, acoladele sunt utilizate { ... }
pentru a încorpora orice alte expresii XQuery în constructor.
Funcționalitate de sortare („ordonare după”)
Spre deosebire de algebra relațională și SQL , elementele de date XML au o ordine implicit predeterminată („ordinea documentului”). Toate expresiile XQuery trebuie să aibă această ordine, cu excepția cazului în care aceasta este dezactivată în mod explicit în expresie (Mod de comandă: neordonat).
Expresii FLWOR
Așa-numitele expresii FLWOR (pronunțate: floare ) joacă un rol central în XQuery . FLWOR este o abreviere pentru constructele for, let, where, order by
și return
poate fi privită ca o analogie cu constructele (SELECT, FROM, WHERE) din SQL. Spre deosebire de SQL, totuși, expresiile FLWOR sunt sensibile la majuscule . Expresiile FLWOR mapează secvențe cu secvențe (vezi modelul de date ). Expresiile FLWOR au următoarea formă generică:
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>
Aici reprezintă <Expr>
orice altă expresie XQuery și <BoolExpr>
o expresie de tip boolean. Cele for
Construcțiile leagă variabilele lor $forvar1, $forvar2, ...
secvențial la o valoare fiecare din legarea secvențelor <Expr>
. Folosind cuvântul cheie at
, poziția variabilei precedente din <Expr>
secvență poate fi legată de o variabilă de poziție, cu numerotarea începând de la 1. În schimb, let
constructele își leagă variabilele $letvar1, $letvar2, ...
de întregul rezultat al expresiei asociate. Secvența de tupluri rezultată conține toate combinațiile posibile de legături variabile care pot fi formate din atribuirea variabilelor for și let.
where
-CONSTRUCT este folosit pentru a elimina tupluri nedorite. Este logic să folosiți expresia sa booleană pentru a face referire la cel puțin una dintre variabilele legate în constructele for
și let
. Același lucru este valabil și pentru order by
construct, care este folosit pentru a sorta tuplurile. În cele din urmă, în return
construcție, variabilele de interes sunt returnate, eventual încorporate în elemente construite direct sau indirect. În cazuri mai complexe, expresiile FLWOR sunt, de asemenea, imbricate, ceea ce înseamnă că <Expr>
orice expresie FLWOR poate fi utilizată în loc de fiecare apariție a .
Următorul exemplu ilustrează utilizarea for
și let
. Partea for
expresiei selectează toate paragrafele dintr-o pagină HTML (<p> elemente). În let
parte, numărul de cuvinte este determinat pentru fiecare paragraf cu ajutorul funcțiilor predefinite. Apoi, toate paragrafele care nu sunt goale (număr de cuvinte> 0) sunt extinse cu o specificație de dimensiune și o ieșire.
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>
Vă rugăm să rețineți cu această expresie că for
- și - let
parte sunt dependente una de cealaltă, for
variabila declarată $par
în let
parte este utilizată în parte. Pentru evaluare, aceasta înseamnă că partea- trebuie reevaluată let
pentru fiecare atribuire a variabilei $par
.
Operații și grupări compuse
Operațiile compuse (sau îmbinările ) denotă o operație de set care constă din formarea unui produs cartezian din două seturi de intrare și o selecție ulterioară (a se vedea Algebra relațională ). O astfel de operație compusă este prezentată deja în exemplul secțiunii anterioare privind expresiile FLWOR. Legăturile dintre variabilele declarate în for
și let
părți formează respectivele where
cantități de intrare la al căror produs cartezian sunt aplicate condițiile de selecție ale piesei. Deoarece condițiile de selecție pot apărea atât în where
-partea expresiei, cât și în for
- și let
-partea în subexpresii, normalizarea este necesară înainte de a evalua o expresie.
Funcții predefinite
Pentru calcularea ecuațiilor aritmetice și a calculelor de date, precum și pentru procesarea secvențelor în modelul de date .
Funcții personalizate
User- declare function
funcții definite pot fi declarate folosind. Forma generală arată astfel:
declare function namespace:funktionsname ($parameter1 as datentyp1, $parameter2 as datentyp2, …) as rückgabedatentyp { <XQuery-Ausdruck> }
Funcțiile pot apela recursiv și alte funcții , astfel încât XQuery este complet Turing .
Diferiti operatori de comparatie
XQuery cunoaște două tipuri de funcții de comparație: calificare pentru valoare sau calificare pentru existență. Operatorii care califică valoarea sunt similari cu operatorii obișnuiți din alte limbaje de programare. Următorii operatori sunt definiți
- eq: Verifică egalitatea
- ne: Verifică inegalitatea (nu egală)
- Lt: Verifică mai puțin de
- gt: Verifică dacă este mai mare de
- le: Verifică dacă este mai mic sau egal
- ge: Verifică dacă este mai mare sau egal
Operatorii „normale“ de comparație ( =
, !=
, <
, >
, <=
, >=
) , printr - o comparație existențială. Pot exista secvențe în stânga și în dreapta operatorului. Deci , expresia este seq1 OP seq2
adevărată numai în cazul în care un element e1
al seq1
și e2
de seq2
acolo în e1 OP e2
cazul în care OP
unul dintre operatorii =
, !=
, <
, >
, <=
sau >=
este. Așa este (1, 2) > (3, 0)
adevărat, există 1 > 0
.
Exemple
Numărarea tuturor elementelor XML ale întrebărilor din documentul sursă:
fn:count(//question)
Exemplu mai complex, listând toate întrebările tuturor documentelor dintr-o galerie pentru KEduca care au mai puțin de două răspunsuri:
<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>
Un alt exemplu (arată posibilitatea restructurării indirecte prin XQuery)
- Document sursa:
<?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>
- Document țintă:
<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>
- Soluție în XQuery:
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>
utilizare
Datorită importanței XML și volume mari de date istorice în relaționale baze de date , The ISO a dezvoltat o extensie a SQL standard numit SQL / XML pentru a combina posibilitățile de XML și SQL. XQuery a fost definit ca limbajul de interogare pentru interogarea datelor XML în contextul funcției SQL XMLQuery.
Implementări
- BaseX , Open Source: XQuery 3.1, XQuery Full-Text 1.0, XQuery Update 1.0
- eXist , Open Source: XQuery 3.0, XQuery Update 1.0
- Saxon , Open Source și Comercial: XQuery 3.1, XQuery Update 1.0
- Sirix , Open Source: XQuery 1.0 (și XQuery Update 1.0 bazat pe Brackit )
- xqerl , Open Source: XQuery 3.1, XQuery Update 3.0
- XQilla , Open Source: XPath 2.0, XQuery Update 1.0
- Zorba , Open Source: XQuery 3.0, XQuery Full Text 1.0, XQuery Update 1.0;
- Rezultate XQuery Test Suite : conformitate XQuery 1.0
literatură
- Priscilla Wamsley: XQuery . O'Reilly Media, Beijing 2007, ISBN 978-0-596-00634-1 .
- Margit Becher: XML - DTD, XML-Schema, XPath, XQuery, XSLT, XSL-FO, SAX, DOM . W3L Verlag, Witten 2009, ISBN 978-3-937137-69-8 .
Link-uri web
- Specificații XQuery
- Cazuri de utilizare XQuery (domenii de aplicare)
- Facilitatea de actualizare XQuery
- Introducere în profunzime a XQuery
Dovezi individuale
- ↑ Michael Wagner: SQL / XML: 2006 - Evaluarea conformității standard a sistemelor de baze de date selectate . Diplomica Verlag, 2010, ISBN 3-8366-9609-6 .