Bulletins météo
Soit le fichier f1.smi
suivant (très proche de la syntaxe SMIL) :
<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 partiespar
, contenant du contenu affiché pendant une duréedur
.les
par
d'uneseq
sont présentes en même temps à l'écran (pour simplifier dans notre cas, les unes en dessous des autres)
Question
Ce fichier est-il un fichier XML bien formé (justifier) ?
Solution
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.).
Question
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) ?
Solution
Le fichier est valide par rapport à la DTD :
L'élément racine est bien
smil
smil
contient unbody
(qui est obligatoire) et pas dehead
(qui est optionnel)Le
body
contient bien uneseq
obligatoire et uniquela
seq
contient quatrepar
(elle devait en contenir au moins un)Chaque
par
contient bien un uniquetext
(obligatoire) avec un attributdur
(obligatoire)Les
text
contiennent uniquement des caractères (#PCDATA).
Question
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) ?
Solution
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.
Question
Pourquoi le fichier f2.smi
n'est-il pas valide par rapport à la DTD smilSuperLight.dtd
?
<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>
Solution
Parce qu'il y a deux éléments text
dans le premier par
, qui n'en autorise qu'un et un seul.
Question
Modifier smilSuperLight.dtd
afin que f2.smi
soit à présent valide par rapport à une nouvelle DTD smilSuperLight2.dtd
Solution
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 :
<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>
<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>
Question
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.
Solution
<!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)>
Question
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.
Indice
Cela correspond à l'exemple de f2.smi
.
Indice
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
Solution simplifiée smilSuperLight
<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
<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>