Vous êtes sur la page 1sur 5

BASES DE DONNEES AVANCEES

Feuille de TD n2
XPath et XQuery
EXERCICE 1 : Requtes sur un document XML avec XPath
Le fichier films.xml vous est fourni. Ce document contient un ensemble d'informations
concernant des films. Appliquez ce document les expressions XPath pour rpondre aux
requtes suivantes :
a) La liste des titres de films.
/films/film/titre

b) Les titres des films parus en 1990.


/films/film[@annee='1990']/titre

c) Le rsum d'Alien.
/films/film[titre='Alien']/resume

d) Titre des films avec Bruce Willis.


/films/film[roles/role/prenom='Bruce' and
roles/role/nom='Willis']/titre

e) Quels films ont un rsum ?


/films/film[count(resume)!=0]

f) Quels films n'ont pas de rsum ?


/films/film[count(resume)=0]

g) Donner les titres des films vieux de plus de trente ans.


/films/film[(2012-@annee)>30]/titre
/films/film[(fn:year-from-dateTime(fn:current-dateTime())@annee)>30]/titre

h) Quel rle joue Harvey Keitel dans Reservoir dogs ?


/films/film[titre='Reservoir dogs']/roles/role[prenom='Harvey' and
nom='Keitel']

i) Qui est le metteur en scne du film Reservoir dogs ?


/films/artiste[@id=/films/film[titre='Reservoir
dogs']/mes/@idref]/(string(actnom),string(actpnom))

j) Quel est le dernier film du document ?


/films/film[position()=last()]

k) Quel est le titre du film qui prcde immdiatement Shining (dans l'ordre du document).
/
films/film[titre='Shining']/preceding::film[position()=last()]/tit
re

l) Qui a mis en scne Vertigo ?


/films/artiste[@id=/films/film[titre='Vertigo']/mes/@idref]

m) Donnez les titres des films qui contiennent un V (utiliser la fonction contains).
/films/film[contains(lower-case(titre),'v')]/titre

n) Donner les nuds qui ont exactement trois descendants (utiliser la fonction count).
//films/*[count(descendant::*)=3]

o) Donner les nuds dont le nom contient la chane TU (fonction name).


//films//*[contains(name(),'tu')]

EXERCICE 2 : Requtes sur un document XML avec


XQuery
Appliquez au document films.xml les expressions XQuery pour rpondre aux requtes (a)
(o) plus aux requtes suivantes :
a) for

$i in /films/film
return $i/titre

for
$i in /films/film/titre
return $i

b) for

$i in /films/film
where $i/@annee = '1990'
return $i/titre

c) for

$i in /films/film
where $i/titre = 'Alien'
return $i/resume

d) for

$i in /films/film
where $i/roles/role/prenom='Bruce' and
$i/roles/role/nom='Willis'
return $i/titre

e) for

$i in /films/film
where count($i/resume) != 0
return $i

f) for

$i in /films/film
where count($i/resume) = 0
return $i

g) for

$i in /films/film
where (year-from-dateTime(current-dateTime())-$i/@annee)>30
return $i/titre

h) for

$i in /films/film
where $i/titre='Reservoir dogs'
return (for
$j in $i/roles/role
where $j/prenom='Harvey' and $j/nom='Keitel'
return $j)

for
where

$i in /films/film/roles/role
$i/ancestor::film/titre='Reservoir dogs' and

$i/prenom='Harvey' and $i/nom='Keitel'


return $i

i) for

$i in /films/artiste
$j := (for
$j in /films/film
where $j/titre='Reservoir dogs'
return $j/mes)
where $i/@id = $j/@idref
return fn:concat($i/actpnom, ' ', $i/actnom)
let

j) for

$i in /films/film
where $i/position() = /films/film/last()
return $i

k) for

$i in /films/film
where $i/following::film[position()=1]/titre='Shining'
return $i/titre

l) for

$i in /films/artiste
$j := (for
$j in /films/film
where $j/titre='Vertigo'
return $j/mes)
where $i/@id = $j/@idref
return fn:concat($i/actpnom, ' ', $i/actnom)
let

m) for

$i in /films/film
where fn:contains(fn:lower-case($i/titre),'v')
return $i/titre

n) for $i in //*

where count($i/descendant::*)=3
return $i

o) for $i in //*

where contains($i/name(),'tu')
return $i

p) Retourner les acteurs avec leurs films, comme suit :


<ACTEUR>
<NOM>John Travolta</NOM>
<FILMS>
<FILM titre="Volte/Face"/>
<FILM titre="Pulp fiction"/>
</FILMS>
</ACTEUR>
for $i in distinct-values(for $i in /films/film/roles/role
return concat($i/prenom, ' ', $i/nom))
return
<ACTEUR>
<NOM>{$i}</NOM>
<FILMS>
{for $j in /films/film
where exists(for
$k in $j/roles/role
where concat($k/prenom, ' ', $k/nom) = $i
return $k)
return <FILM titre="{$j/titre/text()}"/>}
</FILMS>
</ACTEUR>

q) Retourner les metteurs en scne avec le nombre de films quils ont ralis, comme suit :
<MES>
<NOM>Alfred Hitchcock</NOM>
<NUM_FILMS>4</NUM_FILMS>
</MES>
for $x in doc("films")//artiste
let $films:=count(//film/mes[@idref=$x/@id])
where $x/@id=//film/mes/@idref
return element MES{element NOM{concat($x/actnom,' ',
$x/actpnom)},element NUM_FILMS{$films}}