Vous êtes sur la page 1sur 7

1

3ème Licence Fondamentale


Informatique de Gestion TP3
2014/2015 XPATH

Corrigé Exercice1
1. Toutes les compositions
1.1 /CDlist/CD/performance/composition
1.2 //composition où bien //composition/text() --> affiche le texte de l'élément
Composition //tout sous chemin descendant du nœud contextuel
2. Toutes les compositions ayant un "soloist"
2.1 //CDlist/CD/performance[soloist]/composition/text()

2.2 //performance[soloist]/composition/text() où bien

3. Toutes les performances avec un seul "orchestra" mais pas de "soloist"


3.1 //performance[count(orchestra)=1 and count(soloist)=0]
3.2//performance[not(soloist) and count(orchestra)=1]/composition/text()
//CDlist/CD/ performance[not(soloist) and count(orchestra)=1]/composition/text()

4. Tous les soloists ayant joué avec le London Symphony Orchestra sur un CD publié par
Deutsche Grammophon
//performance[orchestra="London Symphony Orchestra" and
//publisher="Deutsche Grammophon"]/soloist/text()
où bien
//CDlist/CD/ performance[orchestra="London Symphony Orchestra" and
//publisher="Deutsche Grammophon"]/soloist/text()
où bien
//CD[publisher="Deutsche Grammophon"]/performance[orchestra="London
Symphony Orchestra"]/soloist

Corrigé Exercice 2
– Trouver la liste des chapitres de la première section :
/child::livre/child::sections/child::section[1]/child::chapitre
/descendant::section[1]/child::chapitre
– Trouver la liste des attributs du premier auteur :
/child::livre/child::auteurs/child::auteur[1]/attribute::*

2
/descendant ::auteur[1]/attribute ::*
– Trouver la valeur de l’attribut nom du deuxième auteur :
string( /child::livre/child::auteurs/child::auteur[2]/attribute::nom )
– Trouver la liste des chapitres contenant deux paragraphes :
/descendant::chapitre[count(child::paragraphe)=2]
– Trouver la liste des chapitres dont un paragraphe possède le mot Premier :
/descendant::chapitre[contains(child::paragraphe,'Premier')]
//sections/section/chapitre[contains(/paragraphe/text(),"Premier paragraphe")]
/descendant::chapitre[contains(/paragraphe/text(),"Premier")]
– Trouver la liste des sections ayant un chapitre :
/descendant::section[count(child::chapitre)=1]
– Trouver la liste des éléments ayant un seul attribut :
/descendant::*[count(attribute::*)=1]
– Trouver la liste des éléments ayant un ancêtre sections :
1. /child::livre/child::sections/descendant::*
2. /descendant::*[ancestor::sections]
– Trouver la liste des attributs titre :
/descendant::*/attribute::titre
– Trouver la liste des éléments ayant deux fils et pas d’attribut :
/descendant-or-self::*[count(child::*)=2 and count(attribute::*)=0]
– Trouver la liste des sections sans paragraphe :
/descendant::section[count(descendant::paragraphe)=0]
– Trouver la liste des éléments dont le texte contient le mot paragraphe :
//descendant::text()[contains(self::text(), 'paragraphe')]/parent::*
Suite
– Trouver la liste de noeuds auteur :
//auteur //auteur/node()
– Trouver la liste de tous les noeuds section :
//section
– Trouver la liste des chapitres de la première section :
/livre/sections/section[1]/chapitre
– Trouver la liste des attributs du premier auteur :
/livre/auteurs/auteur[1]/@*
– Trouver la valeur de l’attribut nom du deuxième auteur :
string( /livre/auteurs/auteur[2]/@nom )

3
– Trouver la liste des sections avec deux chapitres :
//section[count(chapitre)=2]
– Trouver la liste des paragraphes dont le parent a pour titre Chapitre1 :
//paragraphe[../@titre='Chapitre1']
Corrigé Exercice 3
- Renvoyer tout le document
Réponse: /*, /movies
- Renvoyer tous les éléments title du document
Réponse: //title
- Renvoyer tous les prénoms de réalisateur (avec doublons)
Réponse: //director//firstname
- Renvoyer le titre de tous les films dont l’année de sortie est inférieure strictement à
1980 Réponse: //movie[ year < 1980 ]/title
- .Renvoyer le titre de tous les films qui ont au moins un titre alternatif
Réponse : //movie[ count(alternate_titles/*) >= 1 ]/title
- Renvoyer le titre de tous les films qui ont au moins un titre alternatif en français
Réponse: //movie[alternate_title/atitle/@country = "fr" ]/title
- Renvoyer les films (élément movie) où Clint Eastwood est acteur et réalisateur
Réponse: Là encore, pas trop de difficulté : //movie[ actor[ name[ firstname = "Clint" and
lastname = "Eastwood"]] and directors/director[ name[ firstname = "Clint" and lastname =
"Eastwood"]]]
- Renvoyer le titre des films pour lesquels le titre français et le titre original sont
identiques
Réponse: //movie[ title = alternate_titles/atitle[ @country = "fr" ] ]/title
- Renvoyer le titre des films pour lesquels l’un (au moins) des roles des acteurs apparait
dans le titre du film.
Réponse: //movie/actor[ contains( parent::*/title, role) ]/parent::*/title
- Renvoyer le titre des films pour lesquels deux acteurs ont le même nom de famille
Réponse: //movie[ actor[ name/lastname = following-sibling::actor/name/lastname]]/title
- Renvoyer les noms de famille des réalisateurs qui n’apparaissent qu’une fois dans le
document (en tant que réalisateur)
Réponse : //director [ not (name/lastname = following::director/name/lastname) and not
( name/lastname = preceding::director/name/lastname) ]/name/lastname

Corrigé Exercice 4
1/
for $b in doc("biblio.xml")//book
where $b/publisher = "Addison-Wesley" and

4
$b/@year > 1991
return
{$b/title}

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

3/

for $b in doc("books.xml")//book
let $c := $b//author where count($c) >= 1
return $b/title

4/
for $b in doc("books.xml")//book
let $c := $b/author return {{$b/author, $b/title, { count($c) }}
</book>

5/
for $b in doc("books.xml")//book
where $b/price < 50.00
return $b/title

Corrigé Exercice 5

1/ FOR $R IN collection("Restaurants")/Restaurant
RETURN {$R/Nom}
</resultat>

2/
FOR $R IN collection("Restaurants")/Restaurant
let $a:= ($b/Restaurant)[1]
RETURN {$R/Menu/@nom}

3/ FOR $R IN collection("Restaurants")/Restaurant
WHERE $R/Adresse/Ville = “Paris”
RETURN {$R/Nom}

4/
FOR $R IN collection("Restaurants")/Restaurant,
$H IN collection("adresses")/adresse
WHERE $H//Rue = $R//Rue
AND $H//Nom = "des moines"
RETURN
<Result>
{$R/Nom}
{$R/Téléphone}

5
</Result>
5/
FOR $c IN distinct(collection(“Restaurants”)/Restaurant//Ville)
RETURN
<Ville>{$c}</Ville>
<Restaurants>
FOR $r IN collection(“Restaurants”)/Restaurant
WHERE $r//Ville = $c
RETURN {$r}
<Restaurants>

6/
FOR $h IN collection(“Hotels”)/Hotel
WHERE $h/Adresse/Ville IN
FOR $r IN collection(“Restaurants”)/Restaurant
WHERE $r/@categorie = "***"
RETURN {$r/Adresse/Ville/text()}
RETURN {$h/Adresse}

7/
LET $R := collection(“Restaurants”)/Restaurant
RETURN
<NombreRestaurant > count ($R) </NombreRestaurant>
8/
FOR $r IN collection(“Restaurants”)//Restaurant
LET $a := avg(collection(“Restaurants”)// [Restaurant =
$r]//Menu/@Prix)
RETURN
<resultat>
{$r/Nom}
<avgPrix>{$a}</avgPrix>
</resultat>

9/
FOR $r IN collection(“Restaurants”)//Restaurant
WHERE CONTAINS ($r/Comments, “Bon”)
OR CONTAINS ($r/Comments, “Excellent”)
AND $r/Adresse/Ville = “Paris”
RETURN $r/Nom

10/
FOR $r IN unordered(collection(“Restaurants”)//Restaurant)
WHERE $r/Comments CONTAINS (“Excellent”, “Good”)
AND $r/Adresse/Ville = “Paris”
RETURN $r/Nom
SORTBY ($r/Nom DESCENDING)

11/ <XML_document>
<Very_Expensive_Restaurants>
<Title>List of very expensive restaurants</Title>
FOR $r IN collection(Restaurants”)//Restaurant
WHERE EVERY p in $r/Menu/@Prix SATISFIES (p>15)
RETURN
{$r}
</Very_Expensive_Restaurants>
<Very_Inexpensive_Restaurants>
<Title>List of very inexpensive restaurants</Title>
FOR $r IN collection(“Restaurants”)//Restaurant
WHERE SOME p in $r/Menu/@Prix SATISFIES (p<10)
RETURN
{$r}

6
<Date>{date()}</Date>
</Very_Inexpensive_Restaurants>
</XML_document