3.5 - Utilisation de règles multiples pour générer plus de résultats

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.

Une technique intéressante est d'utiliser plusieurs règles pour combiner ensemble deux séries de données sans rapport entre elles. Il suffit de créer une règle pour générer une série de résultats et une seconde règle pour générer une autre série de résultats. Si un résultat de la seconde règle correspond également à la première règle, c'est cette dernière règle qui créera son contenu. Souvenez vous que lorsque la ressource membre d'une règle correspond à plusieurs règles, c'est la première règle rencontrée qui générera son contenu. Si les ressources ne se chevauchent pas, nous pouvons générer du contenu pour deux parties distinctes des données RDF. Cette technique n'est pas couramment employée. Habituellement, toutes les règles sont similaires avec des filtres différents basés sur divers critères.

Ajoutons les données suivantes concernant les gens à la source de données du quartier :

  <rdf:Description rdf:about="http://www.xulplanet.com/rdf/myneighbourhood">
    <r:people>
      <rdf:Seq>
        <rdf:li rdf:resource="http://www.xulplanet.com/rdf/person/1"/>
        <rdf:li rdf:resource="http://www.xulplanet.com/rdf/person/2"/>
      </rdf:Seq>
    </r:people>
  </rdf:Description>

  <rdf:Description rdf:about="http://www.xulplanet.com/rdf/person/1"
                   dc:title="Nathan"/>

  <rdf:Description rdf:about="http://www.xulplanet.com/rdf/person/2"
                   dc:title="Karen"/>

Nous pouvons alors utiliser deux règles pour générer des résultats à partir de différentes parties de la source de données. La première règle correspond aux rues comme avant, mais la seconde règle va générer un résultat pour chaque personne. Une classe header est utilisée pour distinguer le contenu, bien que vous pouvez utiliser le même contenu si vous le souhaitez.

<template>
  <rule>
    <conditions>
      <content uri="?start"/>
      <member container="?start" child="?item"/>
    </conditions>
    <bindings>
      <binding subject="?item" predicate="http://purl.org/dc/elements/1.1/title" object="?title"/>
    </bindings>
    <action>
      <label uri="?item" value="?title" class="header"/>
    </action>
  </rule>
  <rule>
    <conditions>
      <content uri="?start"/>
      <triple subject="?start" predicate="http://www.xulplanet.com/rdf/people" object="?people"/>
      <member container="?people" child="?item"/>
    </conditions>
    <bindings>
      <binding subject="?item" predicate="http://purl.org/dc/elements/1.1/title" object="?title"/>
    </bindings>
    <action>
      <label uri="?item" value="?title"/>
    </action>
  </rule>
</template>

Voir cet exemple.


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.