2.10 - Syntaxe de règles simplifiées

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.

Lorsqu'il est nécessaire de parcourir les fils d'un conteneur RDF, une syntaxe de règle simplifiée peut être utilisée. Elle peut également être utilisée pour parcourir un seul prédicat. Naviguer dans de tel graphe RDF est courant, donc la syntaxe simplifiée est justifiée dans cette situation puisqu'elle limite le nombre de balises. Bien qu'il s'agisse d'une syntaxe simple, elle n'en est pas moins efficace, au moins lorsqu'une règle est invoquée. Une règle simple est équivalente à une règle ayant seulement une balise content et une balise member, de même qu'une série optionnelle de triplets à partir du noeud enfant. Dans sa forme la plus simple, la syntaxe de la règle simplifiée est équivalente aux conditions suivantes :

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

Le constructeur de gabarits utilise la syntaxe de règle simplifiée à chaque fois la règle du gabarit ne contient pas d'élément conditions. Si un élément conditions est présent, la syntaxe complète est utilisée à la place. Dans la syntaxe simplifiée, le constructeur utilisera les conditions par défaut indiquées ci-avant, bien que les noms de variables soient générées aléatoirement.

Puisque la liste des photos parcourt les fils d'un conteneur, nous pouvons utiliser la syntaxe simplifiée. Voici à quoi elle devra ressembler :

<rule>
  <vbox class="box-padded" uri="rdf:*">
    <image src="rdf:*"/>
    <label value="rdf:http://purl.org/dc/elements/1.1/title"/>
  </vbox>
</rule>

Aucun élément conditions ou action n'est utilisé. À la place, le constructeur utilise une série de conditions par défaut, et l'action est placée directement à l'intérieur de l'élément rule. Vous pouvez constater que ce code est bien plus simple que la syntaxe complète. Pour comprendre comment il fonctionne, examinons comment le constructeur traite une règle simplifiée. Tout d'abord, il évalue les conditions par défaut comme ci-dessus, excepté qu'aucune variable n'est utilisée, ou tout au moins aucune utilisée en externe. En réalité, il faut considérer que le constructeur convertit une règle simplifiée en une règle étendue, et ainsi il procède de la même manière. Après que les conditions par défaut aient été évaluées, le réseau d'information ressemble à quelque chose comme ceci :

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

Les nombres sont utilisés ici comme noms de variables, mais en réalité, ils sont générés aléatoirement et en aucune manière vous ne pouvez y faire référence. Les données membres, ou les résultats sont contenus dans la variable représentée par ?2. Trois correspondances ont été trouvées donc le contenu sera dupliqué trois fois.

Il y a plusieurs attributs dans le contenu avec une valeur commençant par rdf:. Comme vous ne pouvez pas déclarer de variables avec la syntaxe simplifiée, une autre manière est employée pour obtenir les données RDF. Le préfixe rdf: signifie de rechercher un prédicat pointant en dehors d'un noeud vers ce résultat (le fils ou le membre d'un noeud). Par exemple, l'attribut value du libellé a une valeur de rdf:http://purl.org/dc/elements/1.1/title. Il signifie de rechercher la valeur du prédicat "http://purl.org/dc/elements/1.1/title" pointant en dehors du résultat courant. Bien sûr, il devient évident que cet attribut définira le titre de la photo.

Vous pouvez obtenir d'autres prédicats de la même manière, simplement en utilisant le prédicat uri et en lui ajoutant le préfixe rdf:. Vous pouvez également combiner deux résultats dans un seul attribut en les séparant par un espace ou un signe ^ comme vous le feriez avec la syntaxe complète. Par exemple :

<label value="rdf:http://purl.org/dc/elements/1.1/title http://www.xulplanet.com/rdf/country"/>

La forme rdf: est réellement équivalente à la balise binding de la syntaxe complète. Le sujet de la liaison est la ressource membre résultante, le prédicat est la chaîne de caractères venant juste après rdf: et l'objet n'est pas nécessaire car la valeur est remplacée directement dans l'attribut. Comme avec les liaisons, la valeur n'est pas nécessaire pour assurer la correspondance, donc les données n'ont pas à être présentes dans le graphe RDF. Si une photo n'a pas de titre, celui-ci sera remplacé par une chaîne de caractères vide.

La valeur spéciale rdf:* signifie l'uri de la ressource résultat, plutôt que la référence à un prédicat. Elle est équivalente à la variable ?photo dans cet exemple si la syntaxe complète était utilisée. Vous pouvez voir dans l'exemple que la valeur rdf:* est utilisée à deux endroits, au niveau de l'attribut uri sur le hbox et de l'attribut src pour l'image.

Voici l'exemple des photos utilisant la syntaxe simplifiée. Le filtrage n'est pas présent dans cet exemple. Il est toutefois possible de faire le filtrage en utilisant des règles simplifiées, c'est ce que nous verrons par la suite.

Conditions de règle simplifiée

Les règles simplifiées utilisent également une méthode plus simple pour le traitement des conditions de filtre des résultats indésirables. Cette méthode vous permet de filtrer les résultats qui ont certains prédicats avec des valeurs spécifiques. Par exemple, vous pouvez filtrer les résultats par catégorie ou par pays. Vous ne pouvez filtrer que sur des prédicats pointant en dehors de la ressource membre. Ceci dit, vous ne pouvez pas filtrer sur des prédicats pointant vers une ressource membre, ou sur des prédicats pointant vers d'autres ressources.

Les conditions sont définies en utilisant des attributs sur l'élément rule. L'espace de nommage de l'attribut et le nom de l'attribut sont combinés pour former le prédicat servant de filtre et la valeur de l'attribut sera la valeur du filtre à appliquer. Tous les résultats correspondant au critère sont acceptés et tous ceux qui n'y correspondent pas sont rejetés. Vous pouvez utiliser de multiples attributs pour filtrer sur plusieurs critères. Dans ce cas, les résultats seront acceptés s'ils correspondent à tous les critères.

Par exemple, pour filtrer les photos d'un pays spécifique :

<hbox id="photosList" datasources="template-guide-photos4.rdf"
      ref="http://www.xulplanet.com/rdf/myphotos"
      xmlns:r="http://www.xulplanet.com/rdf/">
  <template>
    <rule r:country="http://www.daml.org/2001/09/countries/iso#IT">
      <vbox class="box-padded" uri="rdf:*">
        <image src="rdf:*"/>
        <label value="rdf:http://purl.org/dc/elements/1.1/title"/>
      </vbox>
    </rule>
  </template>
</hbox>

Cet exemple montre comment un unique attribut peut servir à filtrer seulement les résultats dont le pays 'country' est défini à http://www.daml.org/2001/09/countries/iso#IT. Le contenu des photos n'appartenant pas de ce pays ne sera pas généré. L'attribut a un espace de nommage qui, une fois substitué, devient http://www.xulplanet.com/rdf/country. Cette syntaxe n'est pas très différente de la façon dont les prédicats sont définis dans le RDF/XML.

L'emploi de cette forme de syntaxe d'attribut sur une règle est équivalente à un triple dans la syntaxe étendue. En fait, le constructeur va convertir en interne l'attribut dans la même forme compilée qui serait utilisée par un triple. Le triplet équivalent à l'exemple ci-dessus serait :

<triple subject="?photo"
        predicate="http://www.xulplanet.com/rdf/country"
        object="http://www.daml.org/2001/09/countries/iso#IT"/>

Ajustement des conditions de la règle simplifiée

La syntaxe simplifiée de règles est limitée dans les possibilités de filtrage, toutefois elle est suffisante dans de nombreuses cas. Naturellement, si vous souhaitez réaliser un filtre dynamique, comme le réalise l'exemple des photos avec la liste déroulante, vous devrez modifier l'attribut sur l'élément rule et reconstruire le gabarit.

function applyFilter(country)
{
  var rule = document.getElementById("filterRule");
  if (country){
    rule.setAttributeNS("http://www.xulplanet.com/rdf/", "country", country);
  }
  else {
    rule.removeAttributeNS("http://www.xulplanet.com/rdf/", "country");
  }
  document.getElementById("photosList").builder.rebuild();
}

Cette version de la fonction applyFilter ne fait que définir ou enlever l'attribut sur la règle selon les besoins. Notez l'emploi des fonctions dédiées aux espaces de nommage (avec le suffixe NS) pour définir ou enlever les attributs avec espaces de nommage. Cet exemple suppose que l'élément rule contient un identifiant id filterRule. Notez que la liste déroulante elle même doit utiliser la syntaxe étendue puisqu'elle ne parcourt pas les fils d'une ressource.

Filtrage utilisant plusieurs tests

Comme il a été mentionné plus tôt, vous pouvez filtrer selon plusieurs critères en utilisant de multiples attributs. Par exemple :

<rule id="filterRule"
      dc:title="Obelisque"
      r:country="http://www.daml.org/2001/09/countries/iso#IT">

Les deux critères de filtre sur cette règle doivent être respectés. Les règles traitent tous les attributs comme des conditions à l'exception de l'attribut id ainsi que d'autres attributs spéciaux qui sont ignorés. Ces attributs spéciaux sont utiles lors du traitement de règles multiples, ce qui sera le sujet d'une prochaine section.


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.