TP XQuery
---------

Correction Exercice 1 :
-----------------------

Requte 1 :
===========
<bib> 
   { 
   for $b in doc("biblio.xml")//book 
   where $b/publisher = "Addison-Wesley" and 
       $b/@year > 1991 
   return 
      <book year="{$b/@year}"> 
         {$b/title} 
      </book> 
   } 
</bib>

Slectionne les livres publis par Addison-Wisley aprs 1991.  Pour
chacun d'entre eux, retourne un lment book contenant le titre du
livre et possdant un attribut year contenant l'anne de publication.
Notez l'utilisation du where pour ajouter une contrainte sur les
lments slectionns par la boucle for.

L'ensemble de ces lments book est plac dans un lment bib.

Requte 2 :
===========
<results> 
   { 
   for $b in doc("biblio.xml")//book, 
       $t in $b/title, 
       $a in $b/author 
   return 
      <result> 
         {$t} 
         {$a} 
      </result> 
} 
</results>

Construit  partir des donnes bibliographiques une liste d'lments
result contenant les associations titre de livre - auteur (jointure).
Ces lments sont placs au sein d'une balise results.
Attention, l'enchanement de variables avec des virgules dans un for 
correspond en fait  plusieurs boucles for imbriques.


Requte 3 :
===========
<results> { 
let $a := doc("biblio.xml")//author 
for $last in distinct-values($a/last), 
$first in distinct-values($a[last=$last]/first) 
order by $last, $first 
return 
<result><author> <last>{$last}</last> 
<first>{$first}</first> </author> 
   { for $b in doc("biblio.xml")/bib/book 
     where some $ba in $b/author 
     satisfies ($ba/last = $last and  
                $ba/first=$first) 
     return $b/title } 
      </result>   } 
</results>

Construit pour chaque auteur la liste des livres dont il est un des
auteurs. Pour chaque auteur, ces informations sont places dans une
balise result. L'ensemble des ces balises est plac dans un lment
results. Une double boucle est ncessaire pour 1/ parcourir la liste
des auteurs et 2/ pour chaque auteur, parcourir la liste des livres
pour recenser les livres dont il est auteur.


Requte 4 :
===========
declare function local:books-by-author ($root, $last, $first) { 
   for $b in $root/book 
   where some $ba in $b/author 
   satisfies ($ba/last = $last and  
              $ba/first=$first) 
   return $b/title  
}; 
<results> {
let $a := doc("biblio.xml")//author 
for $last in distinct-values($a/last), 
$first in distinct-values($a[last=$last]/first) 
order by $last, $first
return <result> 
   <author> <last>{$last}</last>   
   <first>{$first}</first> </author> 
   {local:books-by-author(doc("biblio.xml")/bib, $last, $first)} 
   </result> 
   } 
</results>


Construit le mme rsultat que la requte prcdente. La diffrence
rside dans le fait qu'une fonction a t isole pour excuter ce qui
tait dans la requte prcdente la boucle intrieure : tant donn un
auteur, rcuprer l'ensemble des livres dont il est auteur.

Requte 5 :
===========
<bib> 
   {  
 for $b in doc("biblio.xml")//book 
   where count($b/author) > 0 
   return 
      <book> 
      {$b/title} 
      { for $a in $b/author[position() <= 2] 
        return $a } 
      { if (count($b/author) > 2) 
        then <et-al/> else () } 
  </book>
} 
</bib>


Pour chaque livre de la bibliographie possdant au moins un auteur,
construit un lment book contenant le titre du livre et, s'il y a
moins de deux auteurs, la liste des auteurs, sinon, seulement les deux
premiers auteurs et un lment vide et-al.
L'ensemble est compris dans un lment bib.

Requte 6 :
===========
declare function local:books-by-author ($root, $last, $first) { 
   for $b in $root/book 
   where some $ba in $b/author 
   satisfies ($ba/last = $last and  
              $ba/first=$first) 
   return $b/title  
}; 

<results> {
let $a := doc("biblio.xml")//author 
for $last in distinct-values($a/last), 
$first in distinct-values($a[last=$last]/first) 
order by $last, $first
return <result> 
   <author> <last>{$last}</last>   
   <first>{$first}</first> </author> 
   <number> {count(local:books-by-author(doc("biblio.xml")/bib,$last, $first))} </number>
    </result> 
   } 
</results>

Comme la requte 4 en retournant pour chaque auteur, au lieu de la
liste des livres qu'il a crits, le nombre de livres qu'il a crits.

Requte 7 :
===========
<data> {
for $year in distinct-values(doc("biblio.xml")//book/@year) 
let $avg := avg(doc("biblio.xml")//book[@year=$year]/price/text())
return <year value="{$year}" avgprice="{$avg}"/>
   } 
</data>

Construit pour chaque anne pour laquelle au moins un livre a t
publi un lment year possdant un attribut value avec la valeur de
l'anne concerne et un attribut avgprice contenant le prix moyen des
livres publis cette anne-l. 
L'ensemble est plac dans une balise data.
