Bulletins météo

Soit le fichier f1.smi suivant (très proche de la syntaxe SMIL) :

<?xml version="1.0" encoding="UTF-8"?>
<smil>
  <body>
    <seq>
      <par>
        <text dur="1">Île de France</text>
      </par>
      <par>
        <text dur="1">8 janvier 2010</text>
      </par>
      <par>
        <text dur="3">5 cm de neige en moyenne sur la région</text>
      </par>
      <par>
        <text dur="3">Jusqu'à 10cm de neige sur le sud de la région</text>
      </par>
    </seq>
  </body>
</smil>

Pour rappel :

  • seq décrit une séquence de parties par, contenant du contenu affiché pendant une durée dur.

  • les par d'une seq sont présentes en même temps à l'écran (pour simplifier dans notre cas, les unes en dessous des autres)

Ce fichier est-il un fichier XML bien formé (justifier) ?

Oui car :

  • Il y a un élément racine qui contient tous les autres

  • Chaque élément contient totalement ses fils (toutes les balises sont fermées et il n'y a pas de croisement de balises).

On vérifie par ailleurs qu'il n'y a pas de problème de syntaxe (attributs, caractères utilisés pour les noms des balises, etc.).

Soit la DTD smilSuperLight.dtd suivante  :

<!ELEMENT smil (meta*, body)>
<!ATTLIST meta
  name (title) #REQUIRED
  content CDATA #REQUIRED>
<!ELEMENT body (seq)>
<!ELEMENT seq (par+)>
<!ELEMENT par (text)>
<!ELEMENT text (#PCDATA)>
<!ATTLIST text
  dur CDATA #REQUIRED>

Le fichier f1.smi est-il valide par rapport à cette DTD (justifier) ?

Le fichier est valide par rapport à la DTD :

  • L'élément racine est bien smil

  • smil contient un body (qui est obligatoire) et pas de head (qui est optionnel)

  • Le body contient bien une seq obligatoire et unique

  • la seq contient quatre par (elle devait en contenir au moins un)

  • Chaque par contient bien un unique text (obligatoire) avec un attribut dur (obligatoire)

  • Les text contiennent uniquement des caractères (#PCDATA).

Si smilSuperLight.dtd est un sous-ensemble du schéma SMIL officiel du W3C, le fichier XML f1.smi est-il valide par rapport à la DTD SMIL du W3C (expliquer) ?

Si smilSuperLight.dtd est un sous-ensemble du schéma SMIL officiel cela signifie que le schéma SMIL permet plus d'éléments que smilSuperLight.dtd, mais que ces éléments sont optionnels.

Donc tous les documents XML valides par rapport à smilSuperLight.dtd seront valides par rapport au schéma officiel, puisqu'ils en respecteront les règles.

Pourquoi le fichier f2.smi n'est-il pas valide par rapport à la DTD smilSuperLight.dtd ?

<?xml version="1.0" encoding="UTF-8"?>
<smil>
  <body>
    <seq>
      <par>
        <text dur="1">Champagne</text>
        <text dur="1">8 janvier 2010</text>
      </par>
      <par>
        <text dur="3">Brouillard dominant et éclaircies en fin de matinée</text>
      </par>
    </seq>
  </body>
</smil>

Parce qu'il y a deux éléments text dans le premier par, qui n'en autorise qu'un et un seul.

Modifier smilSuperLight.dtd afin que f2.smi soit à présent valide par rapport à une nouvelle DTD smilSuperLight2.dtd

Il suffit de modifier la ligne définissant par en ajoutant un + après text, pour exprimer le fait qu'il peut y en avoir un à plusieurs.

<!ELEMENT par (text+)>

Soit les deux fichiers XML suivants, structurés selon une sémantique métier :

<?xml version="1.0"?>
<meteo>
  <region>Picardie</region>
  <date>8 janvier 2010</date>
  <phenomene>Pluie et brouillard sur toute la région</phenomene>
  <temperature>
    <matin>-5</matin>
    <soir>-3</soir>
  </temperature>
</meteo>
<?xml version="1.0"?>
<meteo>
  <region>Nord</region>
  <date>8 janvier 2010</date> 
  <phenomene>Brouillard et neige sur le nord de la région</phenomene>
  <phenomene>Vents violents sur le bord de mer</phenomene>
  <phenomene>Verglas sur toute la région</phenomene>
</meteo>

Proposer un schéma XML meteo.dtd selon le formalisme des DTD de telle façon que ces deux fichiers soient valides par rapport à ce schéma.

<!ELEMENT meteo (region, date, phenomene+, temperature?)>
<!ELEMENT region (#PCDATA)>
<!ELEMENT date (#PCDATA)>
<!ELEMENT phenomene (#PCDATA)>
<!ELEMENT temperature (matin, soir)>
<!ELEMENT matin (#PCDATA)>
<!ELEMENT soir (#PCDATA)>

Proposer un programme XSLT permettant de transformer les fichiers de type meteo en smilSuperLight2, en affichant séquentiellement :

  • la région avec la date dans une même première partie (1 seconde chacune, donc 2 secondes en tout),

  • puis chaque phénomène (les températures ne sont pas affichées) pendant 3 secondes chaque.

Cela correspond à l'exemple de f2.smi.

Il y a une difficulté particulière en XSLT à regrouper région et date dans une même partie, si vous ne parvenez pas à résoudre cette difficulté, faite l'exercice sans les regroupez. Cela revient dans ce cas à faire une transformation en smilSuperLight, à l'image de f1.smi.

Solution simplifiée smilSuperLight

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="meteo">
    <smil>
      <body>
        <seq>
          <xsl:apply-templates select="*"/>
        </seq>
      </body>
    </smil>
  </xsl:template>
  <xsl:template match="region">
    <par>
      <text dur="1"><xsl:value-of select="."/></text>
    </par>
  </xsl:template>
  <xsl:template match="date">
    <par>
      <text dur="1">xsl:value-of select="."/></text>
    </par>
  </xsl:template>
  <xsl:template match="phenomene">
    <par>
      <text dur="3"><xsl:value-of select="."/></text>
    </par>
  </xsl:template>
  <xsl:template match="temperature"/>
</xsl:stylesheet>

Solution complète smilSuperLight2

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="meteo">
    <smil>
      <body>
        <seq> 
          <par>
            <text dur="1"><xsl:value-of select="region"/></text>
            <text dur="1"><xsl:value-of select="date"/></text>
          </par>
          <xsl:apply-templates select="phenomene"/>
        </seq>
      </body>
    </smil>
  </xsl:template>
  <xsl:template match="phenomene">
    <par>
      <text dur="3"><xsl:value-of select="."/></text>
    </par>
  </xsl:template>
  <xsl:template match="temperature"/>
</xsl:stylesheet>
AccueilExercices > Exercices XSLT > Exercice : Bulletins météo< PrécédentSuivant >