Bulletins météo

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

1
<?xml version="1.0" encoding="UTF-8"?>
2
<smil>
3
    <body>
4
        <seq>
5
            <par>
6
                <text dur="1">Île de France</text>
7
            </par>
8
            <par>
9
                <text dur="1">8 janvier 2010</text>
10
            </par>
11
            <par>
12
                <text dur="3">5 cm de neige en moyenne sur la région</text>
13
            </par>
14
            <par>
15
                <text dur="3">Jusqu'à 10cm de neige sur le sud de la région</text>
16
            </par>
17
        </seq>
18
    </body>
19
</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)

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  :

1
<!ELEMENT smil (meta*, body)>
2
<!ATTLIST meta
3
  name (title) #REQUIRED
4
  content CDATA #REQUIRED>
5
<!ELEMENT body (seq)>
6
<!ELEMENT seq (par+)>
7
<!ELEMENT par (text)>
8
<!ELEMENT text (#PCDATA)>
9
<!ATTLIST text
10
  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 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).

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 ?

1
<?xml version="1.0" encoding="UTF-8"?>
2
<smil>
3
    <body>
4
        <seq>
5
            <par>
6
                <text dur="1">Champagne</text>
7
                <text dur="1">8 janvier 2010</text>
8
            </par>
9
            <par>
10
                <text dur="3">Brouillard dominant et éclaircies en fin de matinée</text>
11
            </par>
12
        </seq>
13
    </body>
14
</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.

1
<!ELEMENT par (text+)>

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

1
<?xml version="1.0"?>
2
<meteo>
3
    <region>Picardie</region>
4
    <date>8 janvier 2010</date>
5
    <phenomene>Pluie et brouillard sur toute la région</phenomene>
6
    <temperature>
7
        <matin>-5</matin>
8
        <soir>-3</soir>
9
    </temperature>
10
</meteo>
1
<?xml version="1.0"?>
2
<meteo>
3
    <region>Nord</region>
4
    <date>8 janvier 2010</date>
5
    <phenomene>Brouillard et neige sur le nord de la région</phenomene>
6
    <phenomene>Vents violents sur le bord de mer</phenomene>
7
    <phenomene>Verglas sur toute la région</phenomene>
8
</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

1
<!ELEMENT meteo (region, date, phenomene+, temperature?)>
2
<!ELEMENT region (#PCDATA)>
3
<!ELEMENT date (#PCDATA)>
4
<!ELEMENT phenomene (#PCDATA)>
5
<!ELEMENT temperature (matin, soir)>
6
<!ELEMENT matin (#PCDATA)>
7
<!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
1
<?xml version="1.0" encoding="UTF-8"?>
2
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
3
    <xsl:template match="meteo">
4
        <smil>
5
            <body>
6
                <seq>
7
                    <xsl:apply-templates select="*"/>
8
                </seq>
9
            </body>
10
        </smil>
11
    </xsl:template>
12
    <xsl:template match="region">
13
        <par>
14
            <text dur="1">
15
                <xsl:value-of select="."/>
16
            </text>
17
        </par>
18
    </xsl:template>
19
    <xsl:template match="date">
20
        <par>
21
            <text dur="1">xsl:value-of select="."/></text>
22
        </par>
23
    </xsl:template>
24
    <xsl:template match="phenomene">
25
        <par>
26
            <text dur="3">
27
                <xsl:value-of select="."/>
28
            </text>
29
        </par>
30
    </xsl:template>
31
    <xsl:template match="temperature"/>
32
</xsl:stylesheet>
Solution complète smilSuperLight2
1
<?xml version="1.0" encoding="UTF-8"?>
2
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
3
    <xsl:template match="meteo">
4
        <smil>
5
            <body>
6
                <seq>
7
                    <par>
8
                        <text dur="1">
9
                            <xsl:value-of select="region"/>
10
                        </text>
11
                        <text dur="1">
12
                            <xsl:value-of select="date"/>
13
                        </text>
14
                    </par>
15
                    <xsl:apply-templates select="phenomene"/>
16
                </seq>
17
            </body>
18
        </smil>
19
    </xsl:template>
20
    <xsl:template match="phenomene">
21
        <par>
22
            <text dur="3">
23
                <xsl:value-of select="."/>
24
            </text>
25
        </par>
26
    </xsl:template>
27
    <xsl:template match="temperature"/>
28
</xsl:stylesheet>