for $s in //serie
return
- Documents Collection et Collection 2: pour chaque tome de la collection donner son numero, le nom de sa serie et son titre sous forme d'attributs.\\ **Correction:**
for $tome in //tome
return
{$tome/@numero}
- Même question mais en ordonnant les résultats par titre.\\ **Correction:**
for $tome in //tome
let $titre := $tome/titre
order by $titre
return
{$tome/@numero}
- Document Database: pour chaque fichier créer un élément a contenant un attribut href indiquant l'url du document et ayant pour enfant du texte qui indique le nom du document. On pourra utiliser la fonction string(.) pour récupérer la valeur d'un attribut sous forme de texte.\\ **Correction:**
for $f in //file
return
{string($f/@name)}
- Transformer la requête précédente de manière à obtenir une liste html contenant les liens vers les fichiers. (On rappelle qu'une liste html est constituée par un élément ''ol'' ou ''ul'' contenant un ensemble d'éléments ''li'' dont le contenu correspond aux différents "items" de la liste.)\\ **Correction:**
{for $f in //file
return
- {string($f/@name)}
}
- Transformer à nouveau la requête précédente de façon à ce que:
* Les urls des liens soient absolues (i.e. commence bien par ''
Titre du document
Contenu du document
* Copier coller le résultat dans un bloc note et l'enregistrer avec l'extension .html. Ouvrir le fichier avec un navigateur et vérifier que les liens marchent (si le navigateur a du mal, essayer sans la première ligne du résultat).\\ **Correction:**
Documents de la base
{for $f in //file
return
- {string($f/@name)}
}
- Document Bookmarks: donner pour chaque catégorie son nom et ses bookmarks (y compris ceux des sous-catégories). Le resultat devra être trié par nom ou titre, que ce soit pour les categories ou pour les bookmarks.\\ **Correction:**
for $cat in //categorie
let $nom := $cat/@nom
order by $nom
return
{$nom}
{
for $bm in $cat//bookmark
order by $bm/title
return $bm
}
===== Fonctions XQuery =====
Voir le [[:enseignement:bdav:xquery|résumé]] pour la syntaxe des fonctions.
- Document Bookmarks: écrire une fonction de présentation simple des bookmarks: elle prend un argument un noeud bookmark et donne un paragraphe correspondant au titre qui sera un lien (si le titre est absent, mettre l'url à la place du titre) et un paragraphe contenant sa description (ou rien s'il n'y a pas de description). On regroupera ces deux paragraphes dans une élément ''div''.\\ Utiliser la fonction pour générer une page web contenant une liste des bookmarks que vous testerez comme précédement. On pourra utiliser la construction ''if ( test ) then expr1 else expr2''. ''()'' peut être utilisé pour renvoyer un ensemble d'éléments vide.\\ Note: si une expression de chemin est utilisée à la place d'un booléen, on considère qu'elle vaut vrai si son résultat n'est pas vide.\\ **Correction:**
declare function local:pres-bookmarks($bm as element(bookmark))
{
{
if ($bm/title)
then $bm/title/text()
else string($bm/@url)
}
{
for $desc in $bm/description
return
{$desc/text()}
}
};
Bookmarks
{
for $b in //bookmark
return
- {local:pres-bookmarks($b)}
}
- On reprend la question précédente, mais en affichant à l'aide d'une fonction récursive les catégories avec leur bookmarks. Une catégorie sera représentée par un élément ''div'' dans lequel on mettra un paragraphe donnant le nom de la catégorie, un paragraphe regroupant toutes ses descriptions et enfin une liste html qui correspondra à l'ensemble des bookmarks et des catégories qui sont des enfants de la catégorie considérée. On utilisera la fonction précédente pour le formatage des bookmarks. Dans un premier temps on pourra éventuellement mettre en premier les sous-catégories, suivies des bookmarks. Dans un deuxième temps, on conservera l'ordre donné dans le document Bookmarks.\\ **Correction:**
(: Dans cette version on garde l'ordre :)
declare function local:pres-bookmarks($bm as element(bookmark))
{
{
if ($bm/title)
then $bm/title/text()
else string($bm/@url)
}
{
for $desc in $bm/description
return
{$desc/text()}
}
};
declare function local:pres-categorie($cat as element(categorie))
{
{string($cat/@nom)}
{ if ($cat/description) then {$cat/description/text()}
else () }
{
for $sub in $cat/*[self::categorie or self::bookmark]
return
-
{
if ($sub[self::categorie])
then local:pres-categorie($sub)
else local:pres-bookmarks($sub)
}
}
};
Bookmarks
{
for $i in /bookmarks/categorie
return local:pres-categorie($i)
}
- Document Pieces: dans ce document, chaque pièce a un identifiant ''id'', un nom et optionnellement l'identifiant d'une pièce dont elle constitue une partie. Écrire une fonction récursive permettant d'obtenir une hierachie de pièces représentant la composition d'une pièce. Attention, on ne peut pas utiliser un chemain XPath commençant par / dans une fonction. Utiliser cette fonction pour représenter de manière hierachique le document Pieces. \\ **Correction:**
declare function local:mkpc($pc as element(piece))
{
{$pc/@nom}
{$pc/@id (: note: cet attribut ne sert plus à présent :) }
{
for $sub in $pc/../piece[@used-in = $pc/@id]
return local:mkpc($sub)
}
};
{
for $pc in /pieces/piece[not(@used-in)]
return local:mkpc($pc)
}