dernière modification : 2023

Modèle

1. Expressions des modèles

Un modèle est un fomalisme qui définit des contraintes pour un ensemble de documents. Il peut s’exprimer de différentes façon.

Un modèle de document permet d’uniformiser un cadre d’expression au sein d’une communauté : documentaliste (RDF), généalogiste, journaliste (NITF, NewsML), chimiste (CML), etc.

On peut faire un parallèle avec la programmation objet :

  • définir un modèle, c’est définir une classe de documents,

  • créer un document conforme à un modèle, c’est créer une instance de cette classe.

De même, on voit apparaître deux types d’acteurs :

  • le rédacteur en chef qui fixe l’organisation et la structure des documents : c’est lui qui conçoit le modèle

  • les auteurs des documents, qui se conforment au modèle pour rédiger.

Le modèle fixe donc la structure des documents. Il existe différents langages pour l’exprimer :

  • la DTD,

  • XML Schema

  • RelaxNG, etc.

Le modèle d’un document permet d’en fixer :

  • le vocabulaire (c’est-à-dire les balises et attributs utilisables)

  • la grammaire (les règles d’imbrication, etc.)

Un document XML associé à un modèle est dit valide :

  1. s’il est bien formé, et

  2. s’il respecte les spécifications de son modèle.

2. DTD

Une DTD (Document Type Definition) est une liste de déclarations définissant la structure des documents qui s’y conforment. Elle doit être déclarée au début des documents, avant l’élément racine.

2.1. Interne ou externe

La DTD peut être définie dans le document XML :

Exemple — DTD interne
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE personne [
  <!--début de la DTD interne -->
  <!ELEMENT personne (prenom, nom)>
  <!ELEMENT prenom (\#PCDATA)>
  <!ELEMENT nom (\#PCDATA)>
  <!--fin de la DTD interne -->
 ] >

<!--début du document-->
<personne>
   <prenom>Albert</prenom>
   <nom>Camus</nom>
</personne>
<!--fin du document-->

Mais en général, la DTD est externe, car elle est partagée par un ensemble de documents :

DTD externe personne.dtd
<!ELEMENT personne (prenom, nom)>
<!ELEMENT prenom (\#PCDATA)>
<!ELEMENT nom (\#PCDATA)>

Elle est ensuite référencée dans le document XML de la façon suivante :

référence à une DTD locale
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE personne SYSTEM "./DTD/personne.dtd">
<!--début du document-->
<personne>
...

Le plus souvent, elle est même distante et accessible via une URL :

référence à une DTD distante
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE personne SYSTEM "http://serveur.domaine/DTD/personne.dtd">
<!--début du document-->
<personne>
...

2.2. Structure d’une DTD

Une DTD contient en particulier, dans un ordre indifférent :

  • des déclarations d’éléments,

  • des déclarations d’attributs,

  • des commentaires,

  • …​

2.2.1. Déclaration des éléments

Les éléments se déclarent dans un ordre indifférent, si bien qu’une simple lecture ne permet pas de voir directement quel est l’élément racine (il faut chercher l’élément qui n’a pas de père).

Un élément se déclare selon la syntaxe suivante :

<!ELEMENT nom_élément modèle_contenu >

modèle_contenu décrit la structure de l’élément au travers d’un langage emprunté aux expressions régulières. Exemple :

Exemple — personne.dtd
<!ELEMENT personne (nom, prenom+, telephone*, adresse?)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT prenom (#PCDATA)>
<!ELEMENT telephone (#PCDATA)>
<!ELEMENT adresse (#PCDATA)>

signifie que l’élément personne est composé, dans cet ordre, de :

  • un élément nom

  • un ou plusieurs éléments prenom

  • zéro, un ou plusieurs éléments telephone

  • zéro ou un élément adresse

que les quatre éléments nom, prenom, telephone et adresse sont des éléments textuels (#PCDATA).

Le document :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE personne SYSTEM "personne.dtd">
<personne>
  <nom>Martin</nom>
  <prenom>Flora</prenom>
  <adresse>rue des oiseaux, Paris</adresse>
</personne>

est valide, alors que le suivant ne l’est pas :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE personne SYSTEM "personne.dtd">
<personne>
  <prenom>Flora</prenom>
  <nom>Martin</nom>
  <telephone>0240123456</telephone>
  <telephone>0681234567</telephone>
</personne>

Autre exemple :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE para [
  <!ELEMENT para (#PCDATA | note | renvoi)*>
  <!ELEMENT note (#PCDATA)>
  <!ELEMENT renvoi (#PCDATA)>
]>

<para>
  Prendre le chemin de l'Inca <renvoi>1</renvoi> et marcher
  jusqu'à la porte du Soleil <renvoi>2</renvoi>.
  Ne pas oublier de prendre un foulard et de bonnes chaussures.
  <note>1. en suivant le plan</note>
  <note>2. voir page 2</note>
</para>

2.2.2. Déclaration des attributs

La définition d’un attribut contient, dans cet ordre :

  • le nom de l’élément auquel il appartient,

  • son nom,

  • son type,

  • son statut ou une mention de valeur par défaut.

La syntaxe est la suivante :

<!ATTLIST nom_élément nom_attribut type_attribut statut_ou_valeur_par_defaut>
Exemple — Définition des attributs de l’élément image
<!ELEMENT image EMPTY>
<!ATTLIST image source CDATA #REQUIRED>
<!ATTLIST image hauteur CDATA #IMPLIED>
<!ATTLIST image largeur CDATA #IMPLIED>

ce qui s’écrit aussi :

<!ELEMENT image EMPTY>
<!ATTLIST image source  CDATA #REQUIRED
                hauteur CDATA #IMPLIED
                largeur CDATA #IMPLIED>

et pour lequel les 2 éléments ci-dessous seraient conformes :

<image source="photo.jpg" hauteur="300" largeur="200"/>
<image largeur="200" hauteur="300" source="photo.jpg" />

En ce qui concerne le type de l’attribut, citons sans être exhaustif :

  • CDATA : une chaîne de caractères quelconque

  • (val1 | val2 | …​ | valn) : une énumération des valeurs autorisées

Et en ce qui concerne le statut_ou_valeur_par_defaut :

  • #IMPLIED : l’attribut est facultatif

  • #REQUIRED : l’attribut est obligatoire

  • #FIXED "valeur" : l’attribut a cette valeur et celle-ci n’est pas modifiable

  • "valeur" : l’attribut a cette valeur par défaut, mais celle-ci peut être modifiée

Exemple
<!ELEMENT agence (nom, periode, voyage*) >
<!ATTLIST agence  niveau CDATA #REQUIRED > (1)
<!ELEMENT nom (#PCDATA)>
<!ELEMENT periode (#PCDATA) >
<!ELEMENT voyage (pays, duree, descriptif, prix) >
<!ATTLIST voyage niveau (1 | 2 | 3 | 4 | 5) #IMPLIED > (2)
<!ELEMENT descriptif  (#PCDATA | remarque )* >
<!ATTLIST descriptif  langue CDATA "fr" > (3)
<!ELEMENT remarque (#PCDATA) >
<!ELEMENT prix (#PCDATA) >
<!ELEMENT  pays (#PCDATA) >
<!ELEMENT duree (#PCDATA) >
1 L’élément agence a un attribut obligatoire nommé niveau dont la valeur est un texte quelconque.
2 L’élément voyage a un attribut facultatif nommé niveau dont la valeur doit être l’un des cinq premiers nombres entiers,
3 L’élément descriptif a un attribut nommé langue avec une valeur par défaut égale à fr.

3. XML schéma

Les schémas XML ont le même objectif que les DTD. Un schéma XML est lui-même un document XML (fichier XSD). Par rapport aux DTD, les schémas apportent :

  • des types de données : les DTD ne considèrent que le type chaine de caractères

  • la spécification de cardinalité (par exemple, on peut spécifier qu’un élément de type A doit contenir de 3 à 5 éléments de type B)

Exemple de schéma XML :

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="shiporder">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="orderperson" type="xs:string"/>
      <xs:element name="shipto">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="address" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="item" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="note" type="xs:string" minOccurs="0"/>
            <xs:element name="quantity" type="xs:positiveInteger"/>
            <xs:element name="price" type="xs:decimal"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="orderid" type="xs:string" use="required"/>
  </xs:complexType>
</xs:element>

</xs:schema>

Exemple de document conforme à ce schéma :

<?xml version="1.0" encoding="UTF-8"?>

<shiporder orderid="889923"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="shiporder.xsd">
  <orderperson>John Smith</orderperson>
  <shipto>
    <name>Ola Nordmann</name>
    <address>Langgt 23</address>
    <city>4000 Stavanger</city>
    <country>Norway</country>
  </shipto>
  <item>
    <title>Empire Burlesque</title>
    <note>Special Edition</note>
    <quantity>1</quantity>
    <price>10.90</price>
  </item>
  <item>
    <title>Hide your heart</title>
    <quantity>1</quantity>
    <price>9.90</price>
  </item>
</shiporder>

Le schéma étant un document XML, il suit lui-même un modèle défini par un schéma : le schéma des schémas.

4. Dialecte XML

Un dialecte XML est une instance XML contrainte par un modèle XML Voici 3 exemples de dialectes XML.

4.1. SVG (Scalable Vector Graphics)

SVG est un dialecte XML de définition vectorielle de graphiques 2D. Il permet d’exprimer des formes (rectangle, ellipse, etc.), des chemins (ligne, courbe de Bézier, etc.), des textures de remplissages et des transformations (translation, rotation, zoom, etc.). Voici un extrait de code SVG :

 <path
     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
     d="M 50,80 L 170,80"
     id="path2330" />
  <path
     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
     d="M 170,80 L 170,170"
     id="path2332" />
  <path
     style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:3px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
     d="M 170,170 L 110,170"
     id="path2334" />

4.2. MathML

MathML est un dialecte XML de définition de formules mathématiques. Exemple :

  <math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
  <mrow>
    <mi>x</mi>
    <mo>=</mo>
    <mfrac>
      <mrow>
        <mrow>
          <mo>-</mo>
          <mi>b</mi>
        </mrow>
        <mo>±</mo>
        <msqrt>
          <mrow>
            <msup>
              <mi>b</mi>
              <mn>2</mn>
            </msup>
            <mo>-</mo>
            <mrow>
              <mn>4</mn>
              <mo>⁢</mo>
              <mi>a</mi>
              <mo>⁢</mo>
              <mi>c</mi>
            </mrow>
          </mrow>
        </msqrt>
      </mrow>
      <mrow>
        <mn>2</mn>
        <mo>⁢</mo>
        <mi>a</mi>
      </mrow>
    </mfrac>
  </mrow>
</math>

4.3. XHTML

XHTML est un dialecte XML de définition de page web. C’est HTML revisité pour être conforme à la syntaxe XML, c’est-à-dire avec quelques contraintes supplémentaires. Parmi les différences :

les balises et attributs sont en minuscules

ex: <body> et non <BODY>

les éléments vides se terminent par /

ex: <br/> et non <br>

les valeurs des attributs sont délimités

ex: <image witdh="80" et non <image witdh=80>

les attributs doivent avoir une valeur

ex: <input checked="true"> et non <input checked>

Conformément à XML, XHTML est syntaxiquement plus strict et rigoureux que HTML : les document XHTML doivent être a minima bien-formés (à défaut d’être valides). A contrario, les navigateurs web ignorent joyeusement les erreurs dans les pages HTML, pour essayer d’afficher quelque chose coûte que coûte (et le rendu obtenu dépend alors du navigateur utilisé).

Rédiger en XHTML est donc plus contraint que de rédiger en HTML, mais offre l’avantage de disposer de documents plus inter-opérables, dont la syntaxe peut être vérifiée, et pouvant être traités avec toutes les bibliothèques et outils XML existants.