2.7 - Navigation supplémentaire

Attention : Ce tutoriel est ancien, incomplet, et n'est pas mis à jour. Il ne contient pas toutes les nouveautés du système de template de Gecko 1.9 / Firefox 3.0 qui est largement simplifié et permet d'utiliser sqlite ou xml comme source de données. Aussi est-il préférable d'aller consulter la version anglaise sur developer.mozilla.org.

Obtention des littéraux

Les triplets utilisés jusqu'à présent ont tous employé des variables à la fois dans leurs sujets et leurs objets. Toutefois, une chaîne de caractères peut être utilisée. Puisque le sujet d'un arc RDF est toujours une ressource, le sujet peut être une ressource URI. L'attribut object peut être une ressource URI ou une valeur littérale. L'utilisation d'un objet littéral dans un triplet est une manière classique de filtrer des items spécifiques. Par exemple, si les items ont un type identifiable, les données pourront être filtrées pour n'inclure que les items d'un type particulier.

Voici un exemple de triplet que nous pourrions utiliser dans l'exemple des photos :

<conditions>
  <content uri="?start"/>
  <member container="?start" child="?photo"/>
  <triple subject="?photo"
          predicate="http://purl.org/dc/elements/1.1/title"
          object="Canal"/>
</conditions>

Ce nouveau triplet a une valeur statique dans l'attribut object au lieu d'une référence à une variable. Vous pouvez facilement supposer qu'il ne correspondra qu'à une seule photo, la photo Canal. Les autres ne correspondront pas lors de l'évaluation du triplet. En y regardant de plus près, voici le réseau d'information après que le membre a été évalué :


(?start = http://www.xulplanet.com/rdf/myphotos,
 ?photo = http://www.xulplanet.com/ndeakin/images/t/palace.jpg)
(?start = http://www.xulplanet.com/rdf/myphotos,
 ?photo = http://www.xulplanet.com/ndeakin/images/t/canal.jpg)
(?start = http://www.xulplanet.com/rdf/myphotos,
 ?photo = http://www.xulplanet.com/ndeakin/images/t/obselisk.jpg)

Lors de l'évaluation du triplet, le constructeur de gabarits va parcourir les trois résultats potentiels trouvés jusque là. Pour le premier résultat, la valeur http://www.xulplanet.com/ndeakin/images/t/palace.jpg de la variable ?photo sera utilisée comme sujet, le prédicat sera http://purl.org/dc/elements/1.1/title et l'objet sera Canal. Puisqu'il n'y a plus de variables à remplir dans le triplet, le constructeur va simplement confirmer qu'un tel triplet existe dans la source de données. Le triplet n'existe pas pour le premier résultat puisque le titre de la photo est Le palais vu de dessus, donc ce résultat potentiel sera supprimé des données. Pour le second résultat, un tel arc existe, donc le résultat est conservé. Comme pour le premier résultat, l'arc de la troisième photo n'existant pas, son résultat est également supprimé.

Les données résultantes ressembleront à ceci :

(?start = http://www.xulplanet.com/rdf/myphotos,
 ?photo = http://www.xulplanet.com/ndeakin/images/t/canal.jpg)

En voici, l'exemple.

Naturellement, nous devons ajouter une liaison binding pour la variable ?title si nous voulons l'afficher, ou nous pourrions inclure sa valeur dans le code puisque nous savons que sa valeur est Canal. Habituellement, vous ne filtrerez pas sur un titre, mais plutôt sur une valeur définissant ce type.

Il doit y avoir au moins dans un triplet une variable employée soit dans l'attribut subject ou soit dans l'attribut object. Vous ne pouvez pas avoir un triplet sans variables. Il ne constituerait pas un problème, mais il n'aurait aucune utilité particulière. De même, vous ne pouvez pas mettre de variable dans le prédicat. Seuls les attributs subject et object peuvent avoir des variables. Un autre proscris est un triplet dans lequel les variables utilisées seraient inconnues comme dans l'exemple suivant :

<conditions>
  <content uri="?start"/>
  <member container="?start" child="?photo"/>
  <triple subject="?category"
          predicate="http://purl.org/dc/elements/1.1/title"
          object="?title"/>
</conditions>

Dans ce cas, lorsque le constructeur de gabarits en arrive au traitement du triplet, aucune des variables ?category et ?title ne sont remplies, donc le constructeur ne sait pas ce qu'il doit générer. Dans cette situation, aucun contenu ne sera généré.

La balise member doit avoir des variables à la fois pour les attributs container et child. Il ne serait pas courant de filtrer un fils spécifique.

Navigation dans la source

Les triplets peuvent être utilisés pour naviguer en remontant dans un graphe aussi bien qu'en le descendant, en suivant les arcs du graphe en sens inverse. Par exemple, dans l'exemple du début, nous pourrions débuter au sommet D et remonter vers A et C. La syntaxe pour le triplet est la même excepté que la variable connue doit être placée dans l'attribut object du triplet et la variable inconnue doit être placée dans l'attribut subject du triplet.

<conditions>
  <content uri="?start"/>
  <triple subject="?relateditem"
          predicate="http://www.xulplanet.com/rdf/relatedItem"
          object="?start"/>
</conditions>
graphe RDF

Le triplet est évalué de la même manière sauf que la valeur de l'objet peut être remplie avec la valeur de la variable ?start. L'examen du graphe RDF s'effectue sur les arcs pointant vers un sommet et non quittant un sommet. Dans l'exemple des photos, nous voulons cataloguer chaque photo en plusieurs catégories. Une possibilité consiste à simplement ajouter un autre prédicat pour chaque photo avec une valeur littérale définie avec la catégorie. Ou alors, nous pouvons utiliser une ressource pour chaque catégorie. Cette seconde possibilité nous permet d'associer des propriétés supplémentaires à chaque catégories et de de rendre le graphe plus exploitable dans un gabarit. Dans ce cas, nous allons cataloguer chaque photo au pays où la photo a été prise en utilisant un prédicat de pays.

<?xml version="1.0" encoding="iso-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:dc="http://purl.org/dc/elements/1.1/"
         xmlns:nso="http://www.daml.org/2001/09/countries/iso-3166-ont#">

  <rdf:Seq rdf:about="http://www.xulplanet.com/rdf/myphotos">
    <rdf:li rdf:resource="http://www.xulplanet.com/ndeakin/images/t/palace.jpg"/>
    <rdf:li rdf:resource="http://www.xulplanet.com/ndeakin/images/t/canal.jpg"/>
    <rdf:li rdf:resource="http://www.xulplanet.com/ndeakin/images/t/obelisk.jpg"/>
  </rdf:Seq>
  <rdf:Description rdf:about="http://www.xulplanet.com/ndeakin/images/t/palace.jpg"
                   dc:title="Le palais vu de dessus">

    <nso:Country resource="http://www.daml.org/2001/09/countries/iso#IT"/>
  </rdf:Description>
  <rdf:Description rdf:about="http://www.xulplanet.com/ndeakin/images/t/canal.jpg"
                   dc:title="Canal">
    <nso:Country resource="http://www.daml.org/2001/09/countries/iso#NL"/>
  </rdf:Description>
  <rdf:Description rdf:about="http://www.xulplanet.com/ndeakin/images/t/obelisk.jpg"
                   dc:title="Obelisque">

    <nso:Country resource="http://www.daml.org/2001/09/countries/iso#IT"/>
  </rdf:Description>
  <rdf:Description about="http://www.daml.org/2001/09/countries/iso#IT"
                      dc:title="Italie"/>
  <rdf:Description about="http://www.daml.org/2001/09/countries/iso#NL"
                      dc:title="Pays bas"/>
</rdf:RDF>

Un nouveau prédicat de pays a été ajouté à chaque photo sous la forme d'une autre ressource. Notez que ce prédicat utilise un nouvel espace de nommage qui doit être déclaré sur l'élément RDF racine. Maintenant que nous avons des pays pour chaque photos, au lieu de débuter sur le noeud http://www.xulplanet.com/rdf/myphotos, nous allons commencer par une ressource de pays et chercher toutes les photos pointant sur ce pays. L'attribut ref est requis pour changer le point de départ sur la ressource de pays plutôt que sur le conteneur Seq des photos.

<hbox datasources="template-guide-ex2.rdf"
      ref="http://www.daml.org/2001/09/countries/iso#IT">

Dans cet exemple, trois triplets seront utilisés.

<conditions>
  <content uri="?start"/>
  <triple subject="?start"
             predicate="http://purl.org/dc/elements/1.1/title"
             object="?countrytitle"/>

  <triple subject="?photo"
             predicate="http://www.daml.org/2001/09/countries/iso-3166-ont#Country"
             object="?start"/>
  <triple subject="?photo"
             predicate="http://purl.org/dc/elements/1.1/title"
             object="?title"/>
</conditions>

Le premier triplet est utilisé pour obtenir le titre du pays. Il n'y a qu'un seul résultat potentiel à ce stade, le sommet de départ http://www.daml.org/2001/09/countries/iso#IT. Après l'examen du premier triplet, le réseau d'information ressemblera à ceci :

(?start = http://www.daml.org/2001/09/countries/iso#IT,
 ?countrytitle = Italie)

Un seul résultat est présent puisqu'il n'y a qu'un seul titre disponible. Le second triplet est le plus intéressant. Il sert à identifier en remontant les sommets qui ont un prédicat de pays pointant sur eux. Il peut être difficile d'expliquer comment le constructeur recherche les arcs pointant d'un sommet vers un autre simplement en regardant l'élément triple. Le constructeur de gabarits ne peut pas le résoudre tant que le triplet n'a pas été évalué et que la substitution de variables n'ait pas été effectuée. Ici, la valeur de la variable ?start est déjà connue pour le résultat potentiel, donc elle sera remplie. Toutefois, la valeur de la variable ?photo n'est pas connue. Puisque l'objet est connu mais pas le sujet, le constructeur sait qu'il doit rechercher un prédicat pointant sur un sommet. Il y a deux photos dans la source de données RDF qui pointent vers le sommet http://www.daml.org/2001/09/countries/iso#IT, donc le résultat existant sera copié pour ces deux photos. Voici à quoi ressemble les données résultantes après le second triplet :

(?start = http://www.daml.org/2001/09/countries/iso#IT,
 ?countrytitle = Italie,
 ?photo = http://www.xulplanet.com/ndeakin/images/t/palace.jpg)
(?start = http://www.daml.org/2001/09/countries/iso#IT,
 ?countrytitle = Italie,
 ?photo = http://www.xulplanet.com/ndeakin/images/t/obselisk.jpg)

Le troisième triplet ne fait que récupérer les titres des photos comme dans l'exemple précédent, en ajoutant une valeur pour la variable ?title de chaque photo. Nous pouvons alors afficher ces résultats en utilisant le corps d'action suivant :

<vbox uri="?photo" class="box-padded">
  <image src="?photo"/>
  <label value="?title"/>
  <label value="Pays : ?countrytitle"/>
</vbox>

Un libellé pour chaque pays sera affiché. Naturellement, il aura la même valeur pour chaque photo. Des espacements ont été ajoutés autour de chaque photo en utilisant la class box-padded. Voir l'exemple.

En décrivant correctement le graphe RDF et en utilisant les triplets adéquats, nous pouvons naviguer vers n'importe quelles parties des données du RDF nécessaires pour obtenir les résultats attendus. Toutefois, il est plus fréquent de parcourir seulement les fils d'un sommet en utilisant une balise member et, puis d'utiliser un triple ou binding pour chacun des prédicats de chaque fils à afficher. C'est dans ce but que le système de gabarits fût conçu à l'origine et de nombreuses sources de données utilisées par Firefox ou par d'autres produits Mozilla fonctionnent ainsi.

Obtention des parents

Une forme non courante de navigation que vous pouvez employer est de naviguer vers le haut en utilisant une balise member qui se chargera de récupérer tous les parents d'un sommet, comme dans cet exemple :

<conditions>
  <content uri="?start"/>
  <member container="?parent" child="?start"/>
</conditions>

Cette forme pourra être utilisée, par exemple, pour commencer sur une photo particulière et pour trouver tous les conteneurs dans lesquels elle se trouve.


Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.