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
.
<?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>
<?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>