XQuery XML Query Language Sébastien Labrie Sebastien.Labrie@iutbaynne.univ- pau.fr Christian Sallaberry Christian.Sallaberry@univ- pau.fr Bibligraphie http://www.w3.rg/xml/ http://www.w3.rg/tr/xquery/ http://www.w3.rg/tr/xquery-semantics/ http://www.w3.rg/tr/xpath-full-text-10-use-cases/ http://www.gnu.rg/sftware/qex/xquery-intr.html http://www.w3schls.cm/xquery/ http://biblitheques.univ-pau.fr/live/livreselectrniques/editin-eni http://www.gchagnn.fr/curs/xml/index.html http://www.datypic.cm/intrductintxquery.pdf http://www.datypic.cm/bks/xquery/ 2
Xquery : présentatin http://www.w3schls.cm/xquery/ 3 XQuery : présentatin XQuery est un langage de requêtes pur les dcuments et bases de dcuments XML XQuery est suvent cmparé : au langage SQL des bases de dnnées relatinnelles au langage XSLT gérant des structures hiérarchisées XML http://biblitheques.univ-pau.fr/live/livres-electrniques/editin-eni 4
XQuery : présentatin Langages pur interrger des arbres : XQuery, plus pur interrger que pur transfrmer XSLT, plus pur transfrmer XQuery et XSLT utilisent des expressins XPath Langages pur interrger des relatins : SQL, pur interrger deux niveaux : relatins & attributs 5 XQuery : présentatin Analgie XML et BD Vue XML XML XSLT XPath XQuery Vue BD Dnnées HTML & ASP,JSP Référence à un champ SQL Semi-structuré Echange & partage Aut-descriptif Structuré Stckage Nrmes et cntraintes SGBDR 6
XQuery : présentatin Les dnnées relatinnelles snt denses : le schéma existe et est stcké séparément les attributs de chaque instance nt une valeur prblème des valeurs nulles Ce n est pas le cas de XML pur qui : le schéma existe u pas (s il existe, il est stcké dans le dcument u bien séparément) il peut y avir des éléments vides il peut y avir des éléments absents Degré de liberté supérieur pur les dcuments XML dits semi-structurés 7 XQuery : présentatin Les requêtes SQL returnent des relatins, ensembles résultats hmgènes Les requêtes XML returnent des arbres, de type différent de structure cmplexe //*[culeur="ruge"] peut returner une cerise, une viture, On truve côte à côte des éléments et des valeurs atmiques ; des transfrmatins structurelles snt supprtées 8
XQuery : présentatin Les BD XML - relatinnel XML : Traductin en attributs <Vins> <Tuple nv= 100 cru= Jurançn mill= 1999 degré= 12 /> <Tuple nv= 200 cru= Madiran mill= 1996 degré= 12 /> </Vins> 9 XQuery : présentatin Les BD XML - relatinnel XML : Traductin en éléments <Vins> <Tuple> <nv>100</nv> <cru>jurançn</cru> <mill>1999</mill> <degré>12</degré> </Tuple> <Tuple> <nv>200</nv> <cru>madiran</cru> <mill>1996</mill> <degré>12</degré> </Tuple> </Vins> 10
XQuery : présentatin Les BD XML mdèle : BD relatinnelle Cllectin de relatins Relatin Cllectin tuples BD XML Cllectin de frêts Frêt XML Cllectin d arbres Arbre XML Dcument XML 11 XQuery : présentatin Les extensins par rapprt à SQL snt : extractin de sus-arbres : XPath sélectin de sus-arbres (avec prédicats) : XPath variables d itératin sur des cllectins d arbres : XPath jintures pur cmbinaisns d arbres : XQuery rérdnnancement d arbres : XQuery définitin et intégratin de fnctins dans des requêtes : XQuery transfrmatin de dcument (arbres) : XSLT 12
Syntaxe : XQuery : expressin let : permet l affectatin de valeurs à une variable fr : itératin sur une liste de partie de dcument XML return : frme de l expressin à returner where : clause de restrictin de la requête Xquery rder by : tri des résultats If then else : expressin cnditinnelle 13 XQuery : expressin Créatin d éléments : Créatin de l élément XML <valeur> cntenant la chaîne "k " <valeur>k</valeur> Créatin de l élément XML <valeur> qui a pur cntenu la valeur de la variable i let $i := 1 return <valeur>{$i}</valeur> Un cnstructeur d élément XML peut cntenir tut type d expressin XQuery. L expressin dit alrs être placée entre acclades { } Créatin de l élément <resultat> cntenant l ensemble des éléments <titre> de l ensemble des recettes du dcument let $i := /cllectin/recette return <resultat>{$i/titre}</resultat> Lrsque la variable est une séquence, il y a autant d éléments générés que de valeurs dans la séquence d rigine <resultat> <titre>pivrée de steak d autruche sur purée de céleri</titre> <titre>salade de chèvres chauds</titre> </resultat> 14
XQuery : expressin Créatin d éléments : Créatin, pur chacune des recettes du dcument, d un élément <resultat> cntenant l élément <titre> fr $i in /cllectin/recette return <resultat>{$i/titre}</resultat> La différence avec l exemple précédent est la structure returnée. La fermeture de la balise <resultat> après chaque balise <titre> u une seule fis en fin de dcument ne dnne pas la même significatin au dcument XML <resultat> <titre>pivrée de steak d autruche sur purée de céleri</titre> </resultat> <resultat> <titre>salade de chèvres chauds</titre> </resultat> 15 XQuery : expressin Créatin d éléments : Intégratin d une séquence dans le cnstructeur d élément <recette> {fr $i in /cllectin/recette return <resultat>{$i/titre, $i/cmmentaire}</resultat>} </recette> <recette> <resultat> <titre>pivrée de steak d autruche sur purée de céleri</titre> <cmmentaire auteur="labrie">très bn!</cmmentaire> </resultat> <resultat> <titre>salade de chèvres chauds</titre> <cmmentaire auteur="labrie">un classique!</cmmentaire> </resultat> </recette> sus exist : <recette> { fr $i in cllectin("recettes")/cllectin/recette return <resultat>{$i/titre, $i/cmmentaire}</resultat> } </recette> 16
XQuery : expressin Créatin d éléments : Calcul de la valeur d un attribut par un cnstructeur d élément fr $i in /cllectin/recette return <recette image="{$i/image/@src}">{$i/titre}</recette> <recette image="http://www.mesrecettes.cm/imgrecette1.jpg"> <titre>pivrée de steak d autruche sur purée de céleri</titre> </recette> <recette image="http://www.mesrecettes.cm/imgrecette2.jpg"> <titre>salade de chèvres chauds</titre> </recette> 17 XQuery : expressin Créatin d éléments : Utilisatin du mt-clé "element" pur évaluer le nm de l élément créé ("attribut" pur évaluer le nm de l attribut) let $i := "message", $j := "k" return element {$i}{$j} <message>k</message> let $i := "val", $j := "k" return element message {attribute {$i} {$j}, "bn"} <message val="k">bn</message> Ces exemples mntrent cmment générer à partir de valeurs de variables des séquences u des attributs XML 18
XQuery : expressin Expressin FLWOR : fr $<var_f1> in <frest_1> [, $<var_f2> in <frest_2>] //itératin let $<var_s1> := <subtree_1> [, $<var_s2> := <subtree_2 >] //assignatin where <cnditin> //élagage rder by <criterin> //trie return <result> //cnstructin 19 XQuery : expressin Expressin FLWOR : fr $<var_f1> in <frest_1> [, $<var_f2> in <frest_2>] //itératin let $<var_s1> := <subtree_1> [, $<var_s2> := <subtree_2 >] //assignatin where <cnditin> //élagage rder by <criterin> //trie return <result> //cnstructin fr / let where return 1 2 3 20
XQuery : expressin Expressin FLWOR : différence entre F et L fr $i in (2,3) return <res> {2 * $i} </res> <res>4</res> <res>6</res> fr $i in (2,3) return <res> {2 * 1} </res> <res>2</res> <res>2</res> let $i := (2,3) return <res> {2 * 1} </res> <res>2</res> let $i := (2,3,4) return <res> {cunt($i)} </res> ( fr $i in (2,3,4) return <res> {cunt($i)} </res>) <res>3</res> 21 XQuery : expressin Expressin FLWOR : sélectin d éléments fr $i in /cllectin/recette return $i/titre <titre>pivrée de steak d autruche sur purée de céleri</titre> <titre>salade de chèvres chauds</titre> 22
XQuery : expressin Expressin FLWOR : restrictin fr $i in /cllectin/recette where $i/@categrie="entree" return $i/titre <titre>salade de chèvres chauds</titre> fr $i in /cllectin/recette where $i/@prix<15 return $i/titre <titre>salade de chèvres chauds</titre> 23 XQuery : expressin Expressin FLWOR : tri fr $i in /cllectin/recette rder by $i/titre ascending return $i/titre <titre>fie frais aux pmmes</titre> <titre>pivrée de steak d autruche sur purée de céleri</titre> <titre>salade de chèvres chauds</titre> fr $i in /cllectin/recette where $i/ingredient/@nm = "salade" rder by $i/@prix ascending return $i/titre <titre>fie frais aux pmmes</titre> <titre>salade de chèvres chauds</titre> 24
XQuery : expressin Expressin FLWOR : fnctin SI fr $i in /cllectin/recette return <recette> {$i/titre, element {if ($i/ingredient/@nm = "armagnac") then "avec_alcl" else "sans_alcl"} {$i/ingredient}} </recette> <recette> <titre>pivrée de steak d autruche sur purée de céleri</titre> <sans_alcl> <ingredient nm="céleri" qte="500" unite="g"/> <ingredient nm="pmmes de terre" qte="1" unite="kg"/> <ingredient nm="sel fin"/> </sans_alcl> </recette> <recette> <titre>fie frais aux pmmes</titre> <avec_alcl> <ingredient nm="fie" qte="300" unite="g"/> <ingredient nm="armagnac" qte="5" unite="cl"/> <ingredient nm="pmmes" qte="3"/> <ingredient nm="salade" qte="1"/> </avec_alcl> </recette> 25 XQuery : expressin Expressin FLWOR : fnctins prédéfinies (valides XPath) let $R := dc("recettes.xml")//recette return <NmbreRecettes> {cunt($r)} </NmbreRecettes> <NmbreRecettes>3</NmbreRecettes> 26
XQuery : expressin Expressin FLWOR : fnctins prédéfinies let $a := //cmmentaire fr $d in distinct-values($a/@auteur) return <auteur> {$d} </auteur> <auteur>labrie</auteur> <auteur>sallaberry</auteur> 27 XQuery : expressin Expressin FLWOR : fnctins prédéfinies fr $d in dc("recettes.xml")//recette return <res> {$d/titre}{data($d/preparatin)} </res> <res> <titre>pivrée de steak d autruche sur purée de céleri</titre> Peler le céleri et les pmmes de terre. Faire cuire dans l eau buillante. Arrser du jus de viande </res> <res> 28
XQuery : expressin Expressin FLWOR : fnctins persnnalisées declare functin lcal:quantitecmmentaires($i as nde()) as xs:integer {cunt($i/cmmentaire)}; fr $i in //recette return <res> {$i/titre} <cm>{lcal:quantitecmmentaires ($i)} </cm> </res> <res> <titre>pivrée de steak d autruche sur purée de céleri</titre> <cm>2</cm> </res> <res> <titre>salade de chèvres chauds</titre> <cm>1</cm> </res> <res> <titre>fie frais aux pmmes</titre> <cm>1</cm> </res> 29 XQuery : expressin Expressin FLWOR : quantificateur universel let $seuil := 40 return <message> {if (every $i in //recette satisfies $i/@prix > $seuil) then "Trp cher" else "Pas cher"} </message> <message>pas cher</message> 30
XQuery : expressin Expressin FLWOR : quantificateur universel fr $i in /cllectin/recette where every $c in $i/cmmentaire satisfies cntains($c, "bn") return $i/titre <titre>pivrée de steak d autruche sur purée de céleri</titre> 31 XQuery : expressin Expressin FLWOR : quantificateur existentiel let $seuil := 15 return <message> {if (sme $i in //recette satisfies $i/@prix > $seuil) then "Des répnses" else "Pas de répnse"} </message> <message>des répnses</message> 32
XQuery : expressin Expressin FLWOR : quantificateur existentiel fr $i in /cllectin/recette where sme $c in $i/cmmentaire satisfies $c/@auteur="labrie" return $i/titre <titre>pivrée de steak d autruche sur purée de céleri</titre> <titre>salade de chèvres chauds</titre> 33 XQuery : expressin Cas particulier de la jinture : exemple gestin cmmerciale fr $p in dc("gestincmmerciale-v2.xml")//prduit, $cp in dc("gestincmmerciale-v2.xml")//cmmande/detail/prduit where $p/designatin = "Bâtn de clle" and $cp/@ref = $p/@id return <res> {$p/designatin} <cm> <numcm>{$cp/../../@id}</numcm> </cm> </res> fr $p in dc("gestincmmerciale-v2.xml")//prduit where $p/designatin = "Bâtn de clle" return <res> {$p/designatin} <cm> {fr $cp in dc("gestincmmerciale-v2.xml")//cmmande/detail/prduit where $cp/@ref = $p/@id return <numcm> {data($cp/../../@id)} </numcm> } </cm> </res> 34
XQuery : expressin Expressin FLWOR : rappel Nm Ntatin Rôle Assignatin et cnstructin let $var := expr Cnstructin d un élément XML et assignatin à une variable $var Prjectin $var / xpath Extractin de séquences d éléments u d attributs d un arbre XML à l aide d une expressin de chemin XPath Accès dnnées $var / xpath / data() Extractin de séquences de dnnées d un arbre XML à l aide d une expressin XPath u de la fnctin data() 35 XQuery : expressin Expressin FLWOR : rappel Nm Ntatin Rôle Itératin Sélectin (restrictin) Quantificatin existencielle fr $var IN seq return expr fr $var IN seq where qual return cns sme $var in seq satisfies qual Itératin sur les éléments d une séquence et cnstructin d une séquence résultat dérivée Itératin avec sélectin des arbres satisfaisant la qualificatin qual : expressin de la frme expr1 expr2 Expressin de qualificatin vraie si un des éléments de la séquence satisfait la qualificatin qual 36
XQuery : expressin Expressin FLWOR : rappel Nm Ntatin Rôle Quantificatin universelle Jinture Tri every $var in seq satisfies qual fr $var1 in seq1 $var2 in seq2 where qual return expr expr1 srtby expr2 Expressin de qualificatin vraie si tus les éléments de la séquence satisfnt la qualificatin qual Expressins d itératin imbriquées permettant de jindre seq1 et seq2 seln la qualificatin qual Tri de la séquence Expr1 seln les dnnées extraites par Expr2 37 XQuery : expressin Expressin FLWOR : rappel Nm Ntatin Rôle Fnctins intégrées Définitin de fnctin distinct-value avg, cunt, define functin nm ([type:var]*) returns cllectin Éliminatin des dubles Fnctins d agrégats Définitin d une fnctin paramétrée returnant une cllectin d arbres XML 38
Exercices! Recherche d infrmatin avec XQuery 39 Exercice 1 : éditeur Xygen Ouvrir un nuveau fichier 40
Exercice 1 : éditeur Xygen Ecrire et exécuter une requête XQuery 41 Exercice 1 : éditeur Xygen Ecrire et exécuter une requête XQuery 42
Exercice 2 : Oxygen & XQuery Interrger le fichier gestin_cmmerciale.xml : Nms et prénms des clients Clients qui nt des cmmandes Clients et nmbre de cmmandes Clients qui nt plus de 2 cmmandes Clients qui n nt pas de cmmande Désignatin et prix des prduits à plus de 10 eurs Prduits en rupture de stck (quantité en stck < 2) Prduits cmmandés Cde des cmmandes cmprenant plus de deux lignes de cmmande Nmbre ttal de bâtns de clle cmmandés Nmbre de bâtns de clle en stck Nmbre de cmmandes 43 Exercice 3 : éditeur exist 44
Exercice 3 : éditeur exist 45 Exercice 3 : éditeur exist 46
Exercice 3 : éditeur exist 47 Exercice 4 : exist & XQuery Interrger le fichier gestin_cmmerciale.xml : 1. Nms et prénms des clients 2. Clients qui nt des cmmandes 3. Clients et nmbre de cmmandes 4. Clients qui nt plus de 2 cmmandes 5. Clients qui n nt pas de cmmande 6. Désignatin et prix des prduits à plus de 10 eurs 7. Prduits en rupture de stck (quantité en stck < 2) 8. Prduits cmmandés 9. Cde des cmmandes cmprenant plus de deux lignes de cmmande 10. Nmbre ttal de bâtns de clle cmmandés 11.Nmbre de bâtns de clle en stck 12. Nmbre de cmmandes 48