Valid XHTML     Valid CSS2    

XML en L2, université d'Angers

    gilles.hunault@univ-angers.fr

 

T.P. numéro 1

 

Table des matières cliquable

  1. Rendre un document HTML valide pour la grammaire XHTML 1.0 Strict

  2. Passer de XHTML 1.0 Transitionnel à XHTML 1.0 Strict

  3. Créer un document XML qui respecte une grammaire DTD

  4. Créer un document XML qui respecte une grammaire XSD

  5. Créer des grammaires DTD et XSD

 

Il est possible d'afficher toutes les solutions via  ?solutions=1  et de les masquer via  ?solutions=0 .

 

1. Rendre un document HTML valide pour la grammaire XHTML 1.0 Strict

Ce n'est pas parce qu'un navigateur affiche un document qu'il est valide. Corriger le document HTML de l'archive l2xml_bad.zip pour qu'il soit valide pour la grammaire XHTML 1.0 Strict. On pourra utiliser des outils Web ou en ligne de commande.

Solution :  

Que ce soit à l'aide d'un outil Web comme le W2C validator, d'un outil intégré à Firefox comme HTML Validator ou d'un outil en ligne de commande comme rxp, xmllint ou xmlstarlet, on trouve les erreurs suivantes :

  • il manque la structure englobante html/head/body ;

  • il manque donc aussi l'élément title dans la partie head ;

  • le deuxième paragraphe qui commence en ligne 4 n'est pas fermé car il n'y a pas de </p> correspondant à son <p> ;

  • toujours en ligne 4 l'entité &nbsp est mal écrite, il manque un point-virgule en fin d'entité  ;

  • le lien pour Google est incorrect, il faut des guillemets autour de l'URL  ;

  • le lien pour Google est un élément inline et doit être inclus dans un élément de type boite comme par exemple un élément p ou div.

La page l2xml_ok.html contient une version corrigée de la page et avec une indication explicite du jeu de caractères utilisé.

Remarque : une page Web peut comporter autre chose que du HTML ; ainsi les erreurs CSS et JavaScript ne sont pas détectables via ces outils.

 

2. Passer de XHTML 1.0 Transitionnel à XHTML 1.0 Strict

Quelles sont les principales différences entre les grammaires XHTML 1.0 Transitionnel et XHTML 1.0 Strict ?

Solution :  

Comme le montre notre comparateur de grammaires DTD, ce sont surtout les éléments font, iframe et center qui ne sont plus admis en XHTML 1.0 Strict. Ce qui signifie qu'il faut utiliser plus de CSS.

On pourra lire l'article trans-vs-strict pour plus de détails.

 

3. Créer un document XML qui respecte une grammaire DTD

Nous admettrons pour ce qui suit qu'une molécule est définie par une liste d'atomes avec le nom des atomes, leur notation et le nombre de ces atomes fournis en attributs. Par exemple la molécule d'eau H2O est définie par l'atome de nom hydrogène, de notation H en nombre 2 et par l'atome de nom oxygène, de notation O et en nombre 1 (qui peut donc être omis). Après avoir lu soigneusement le fichier suivant nommé molecule.dtd, écrire un fichier eau.xml valide pour cette grammaire DTD. On utilisera un outil en ligne de commande pour vérifier cette validité. On pourra ignorer les accents.

Fichier molecule.dtd :


     <!ELEMENT molecule (atome)+ >
     <!ELEMENT atome    EMPTY    >
     
     <!ATTLIST atome    nom      CDATA  #REQUIRED >
     <!ATTLIST atome    lettre   CDATA  #REQUIRED >
     <!ATTLIST atome    nombre   CDATA  "1"       >
     

Solution :  

Voici un fichier eau.xml possible :


     <?xml version="1.0" ?>
     <molecule>
       <atome nom="Hydrogene" lettre="H" nombre="2" />
       <atome nom="Oxygene"   lettre="O" nombre="1" />
     </molecule>
     

On peut vérifier la validité de ce fichier pour la grammaire molecule.dtd via les commandes suivantes :


     xmllint --dtdvalid molecule.dtd --valid eaudtd.xml
     
     xmlstarlet val -d molecule.dtd eau.xml
     

 

4. Créer un document XML qui respecte une grammaire XSD

On décide maintenant d'utiliser la grammaire molecule.xsd suivante pour stocker les mêmes informations.

Fichier molecule.xsd :


     <?xml version="1.0" encoding="UTF-8"?>
     <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
     
       <xs:element name="molecule">
         <xs:complexType>
           <xs:sequence>
             <xs:element maxOccurs="unbounded" ref="atome"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
     
       <xs:element name="atome">
         <xs:complexType>
           <xs:sequence>
             <xs:element ref="nom"/>
             <xs:element ref="nombre"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
     
       <xs:element name="nom">
         <xs:complexType>
            <xs:simpleContent>
               <xs:extension base="xs:string">
                  <xs:attribute name="lettre" use="required" type="xs:string"/>
               </xs:extension>
            </xs:simpleContent>
         </xs:complexType>
       </xs:element>
     
       <xs:element name="nombre" type="xs:integer"/>
     
     </xs:schema>
     

Ecrire un fichier eau2.xml valide pour cette grammaire XSD. On utilisera un outil en ligne de commande pour vérifier cette validité. Là encore, on pourra ignorer les accents.

Solution :  

Voici un fichier eau2.xml possible :


     <?xml version="1.0" ?>
     <molecule>
       <atome>
          <nom lettre="O">Oxygene</nom>
          <nombre>1</nombre>
       </atome>
       <atome>
          <nom lettre="H">Hydrogene</nom>
          <nombre>2</nombre>
       </atome>
     </molecule>
     

On peut vérifier la validité de ce fichier pour la grammaire molecule.xsd via les commandes suivantes :


     xmllint --noout --schema molecule.xsd eau2.xml
     
     xmlstarlet val -s molecule.xsd eau2.xml
     

 

5. Créer des grammaires DTD et XSD

Disons qu'un trajet ferroviaire est représenté schématiquement mais obligatoirement par un numéro identifiant de trajet, un type de train, un lieu de départ et un lieu d'arrivée. Ces informations sont éventuellement complétées, lorsqu'elles sont disponibles, par deux informations ts (pour time stamp en anglais) qui fournissent respectivement la date et heure de départ et la date et heure d'arrivée.

Voici un exemple de fichier XML regroupant deux trajets, nommé trajets.xml.

Fichier trajets.xml :


     <trajets>
       <trajet id="tr02436">
            <train>TGV </train>
            <depart>Angers</depart>
            <arrive>Paris Montparnasse</arrive>
       </trajet>
       <trajet id="tr5897">
            <train>Micheline </train>
            <depart ts="2016-09-08 13:00">Troyes</depart>
            <arrive ts="2016-09-08 17:08">Dijon</arrive>
       </trajet>
     </trajets>
     

Donner pour ce fichier trajets.xml une grammaire DTD minimale et raisonnable qui permet de décrire les trajets ferroviaires puis une grammaire XSD équivalente.

Solution :  

On lira attentivement les fichiers ci-dessous.

Grammaire trajets.dtd :


     <!ELEMENT trajets (trajet)+                 >
     <!ELEMENT trajet  (train,depart,arrive)     >
     <!ELEMENT train   (#PCDATA)                 >
     <!ELEMENT depart  (#PCDATA)                 >
     <!ELEMENT arrive  (#PCDATA)                 >
     
     <!ATTLIST trajets xmlns CDATA #FIXED ''                       >
     <!ATTLIST trajet  xmlns CDATA #FIXED '' id NMTOKEN #REQUIRED  >
     <!ATTLIST train   xmlns CDATA #FIXED ''                       >
     <!ATTLIST depart  xmlns CDATA #FIXED '' ts CDATA #IMPLIED     >
     <!ATTLIST arrive  xmlns CDATA #FIXED '' ts CDATA #IMPLIED     >
     

Grammaire trajets.xsd :


     <?xml version="1.0" encoding="UTF-8"?>
     <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
     
       <xs:element name="trajets">
         <xs:complexType>
           <xs:sequence>
             <xs:element maxOccurs="unbounded" ref="trajet"/>
           </xs:sequence>
         </xs:complexType>
       </xs:element>
     
       <xs:element name="trajet">
         <xs:complexType>
           <xs:sequence>
             <xs:element ref="train"/>
             <xs:element ref="depart"/>
             <xs:element ref="arrive"/>
           </xs:sequence>
           <xs:attribute name="id" use="required" type="xs:NCName"/>
         </xs:complexType>
       </xs:element>
     
       <xs:element name="train" type="xs:NCName"/>
       <xs:element name="depart">
         <xs:complexType>
           <xs:simpleContent>
             <xs:extension base="xs:NCName">
               <xs:attribute name="ts"/>
             </xs:extension>
           </xs:simpleContent>
         </xs:complexType>
       </xs:element>
     
       <xs:element name="arrive">
         <xs:complexType mixed="true">
           <xs:attribute name="ts"/>
         </xs:complexType>
       </xs:element>
     
     </xs:schema>
     

Il existe des outils pour créer automatiquement des grammaires à partir d'exemples, comme par exemple trang.

 

Questions sans réponse écrite (donc venez en TP !)

  • Que faut-il changer dans les fichiers XML et dans les grammaires DTD et XSD précédentes si on décide d'utiliser des accents, que ce soit avec un encodage latin1 ou UTF ?

  • Est-ce qu'un navigateur peut être validant c'est-à-dire refuser l'affichage d'un document XML s'il n'est pas valide pour la grammaire indiquée en début de document ?

  • Après avoir vérifié qu'un document DOCX ou ODT est une archive (lisible par exemple par zip), chercher comment on peut lister tous les espaces de noms associés. Où trouve-t-on les grammaires pour ces documents ?

 

Code-source php de cette page.

 

 

retour gH    Retour à la page principale de   (gH)