BASES DE DONNEES AVANCEES Feuille de TD n°2 XPath et XQuery EXERCICE 1 : Requêtes 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 répondre aux requêtes 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 résumé 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 résumé ? /films/film[count(resume)!=0]
f) Quels films n'ont pas de résumé ? /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 rôle joue Harvey Keitel dans Reservoir dogs ? /films/film[titre='Reservoir dogs']/roles/role[prenom='Harvey' and nom='Keitel']
i) Qui est le metteur en scène 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 précède immédiatement Shining (dans l'ordre du document). / films/film[titre='Shining']/preceding::film[position()=last()]/tit re
l) Qui a mis en scène 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 nœuds qui ont exactement trois descendants (utiliser la fonction count). //films/*[count(descendant::*)=3]
o) Donner les nœuds dont le nom contient la chaîne TU (fonction name). //films//*[contains(name(),'tu')]
EXERCICE 2 : Requêtes sur un document XML avec XQuery Appliquez au document « films.xml » les expressions XQuery pour répondre aux requêtes (a) à (o) plus aux requêtes 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 :
John Travolta for $i in distinct-values(for $i in /films/film/roles/role return concat($i/prenom, ' ', $i/nom)) return
{$i} {for $j in /films/film where exists(for $k in $j/roles/role where concat($k/prenom, ' ', $k/nom) = $i return $k) return }
q) Retourner les metteurs en scène avec le nombre de films qu’ils ont réalisé, comme suit :
Alfred Hitchcock 4 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}}