Pour lancer l'interface XQuery, cliquer sur le lien si dessus. Dans le cas où le navigateur vous demande avec quoi ouvrir le fichier, choisir “Java Web Start” ou javaws.exe. Voir le TP XPath pour plus de détails ou si JavaWS ne fonctionne pas.
Voici quelques liens sur XPath et XQuery:
Donner une expression FLWOR correspondant à chacune des requêtes suivantes:
for $s in //serie return <serie titre="{$s/@nom}" editeur="{$s/editeur/@nom}"/>
for $tome in //tome return <tome serie="{$tome/../@nom}" titre="{$tome/titre/text()}"> {$tome/@numero} </tome>
for $tome in //tome let $titre := $tome/titre order by $titre return <tome serie="{$tome/../@nom}" titre="{$titre/text()}"> {$tome/@numero} </tome>
for $f in //file return <a href="{$f/@url}">{string($f/@name)}</a>
ol
ou ul
contenant un ensemble d'éléments li
dont le contenu correspond aux différents “items” de la liste.)<ul> {for $f in //file return <li><a href="{$f/@url}">{string($f/@name)}</a></li> } </ul>
http://liris.cnrs.fr/~ecoquery/files/
). On pourra utiliser la fonction concat(.,.)
.<html> <head> <title>Titre du document</title> </head> <body> Contenu du document </body> </html>
<html> <head> <title>Documents de la base</title> </head> <body> <ul> {for $f in //file return <li><a href="{concat('http://liris.cnrs.fr/~ecoquery/files/',$f/@url)}">{string($f/@name)}</a></li> } </ul> </body> </html>
for $cat in //categorie let $nom := $cat/@nom order by $nom return <categorie> {$nom} { for $bm in $cat//bookmark order by $bm/title return $bm } </categorie>
Voir le résumé pour la syntaxe des fonctions.
div
.if ( test ) then expr1 else expr2
. ()
peut être utilisé pour renvoyer un ensemble d'éléments vide.declare function local:pres-bookmarks($bm as element(bookmark)) { <div> <p> <a href="{$bm/@url}"> { if ($bm/title) then $bm/title/text() else string($bm/@url) } </a> </p> { for $desc in $bm/description return <p> {$desc/text()} </p> } </div> }; <html> <head> <title>Bookmarks</title> </head> <body> <ul> { for $b in //bookmark return <li>{local:pres-bookmarks($b)}</li> } </ul> </body> </html>
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.(: Dans cette version on garde l'ordre :) declare function local:pres-bookmarks($bm as element(bookmark)) { <div> <p> <a href="{$bm/@url}"> { if ($bm/title) then $bm/title/text() else string($bm/@url) } </a> </p> { for $desc in $bm/description return <p> {$desc/text()} </p> } </div> }; declare function local:pres-categorie($cat as element(categorie)) { <div> <p>{string($cat/@nom)}</p> { if ($cat/description) then <p>{$cat/description/text()}</p> else () } <ul> { for $sub in $cat/*[self::categorie or self::bookmark] return <li> { if ($sub[self::categorie]) then local:pres-categorie($sub) else local:pres-bookmarks($sub) } </li> } </ul> </div> }; <html> <head> <title>Bookmarks</title> </head> <body> <ul> { for $i in /bookmarks/categorie return local:pres-categorie($i) } </ul> </body> </html>
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. declare function local:mkpc($pc as element(piece)) { <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) } </piece> }; <pieces> { for $pc in /pieces/piece[not(@used-in)] return local:mkpc($pc) } </pieces>