XML

Présentation

XML (eXtensible Markup Language) est un méta-langage, c'est à dire un langage permettant de définir d'autres langages. Les langages qu'il définit sont des langages de présentation de documents.

A l'aide de XML on peut définir des types de documents. Par exemple modèle de lettres d'embauche, documentation pour automobiles, recettes de cuisine, etc.

XML ne donne pas de règles de présentation d'un document. C'est XSL (eXtensible Style Language) qui s'en charge.

Historique

fin des années 60 : IBM, un méta-langage pour documents : GML ("General Markup Language").

1978 : the American National Standards Institute (ANSI) première version de SGML.

1985 : Draft standard de SGML 1986 : premier standard (Anders Berglund, CERN)

1986 : SGML standard ISO s

1990 : HTML (Tim Berners-Lee CERN Conseil Européen pour la Recherche Nucléaire, Genève Dec. 1990)

1996 : début du développement de XML

Février 1998 : XML standard W3C

Ces différents "Markup Language" ne se situent pas au "même niveau".
SGML (Standard Generalized Markup Language) comme XML permettent de définir des grammaires de documents (i.e. ensemble de règles que doit vérifier un document pour être "conforme"). Une telle grammaire est appelée une DTD (Document Type Definition).

HTML est une de ces DTD. La grammaire HTML a été définie par SGML. Une "page" HTML est un document vérifiant cette grammaire.

Présentation vs. Sémantique

HTML est un langage qui précise essentiellement la présentation d'un document : centré, en gras, couleur. En aucun cas on ne précise en HTML si on affiche une formule de politesse, un numéro de téléphone, une recette de cuisine ou un ingrédient de cette recette, ... Ces notions sont des notions de sémantique sur le document.

La sémantique d'un document peut être décrite en SGML. SGML a été jugé trop "complexe" et XML en est une version plus simple. On peut alors à l'aide de ces langages décrire un document comme une suite :
<Expéditeur>
<vers>
<Destinataire>
<Invite>
<Suite de paragraphes>
<Formule de politesse>
<Date>
<Signature>

Il faut alors décrire une présentation pour chacune des parties ci dessus.

Un exemple de documents XML

Voyons un document XML complet ce qui nous permettra de nous familiariser avec la syntaxe XML.

fondue.xml

<?xml version="1.0"?> 
<Recette> 
   <Nom>La fondue savoyarde</Nom> 
   <Remarque> Comme me l'a enseigné mon père </Remarque> 
   <Ustensiles>
      <Ustensile> 
         <Qty unit="">1</Qty> 
         <Item>Caquelon</Item> 
         <Commentaire>c'est une casserole en terre cuite</Commentaire> 
      </Ustensile> 
       <Ustensile> 
         <Qty unit="">1</Qty> 
         <Item>réchaud</Item> 
      </Ustensile> 
  </Ustensiles> 
   <Ingredients> 
      <Ingredient> 
         <Qty unit="grammes par personne">100</Qty> 
         <Item>Fromage Beaufort</Item> 
      </Ingredient> 
      <Ingredient> 
         <Qty unit="grammes par personne">100</Qty> 
         <Item>Fromage Comté</Item> 
      </Ingredient> 
      <Ingredient> 
         <Qty unit="">1</Qty>
         <Item>gousse d'ail</Item>
      </Ingredient> 
      <Ingredient> 
         <Qty unit="bouteille 75 cl">1</Qty> 
         <Item>vin blanc sec</Item> 
      </Ingredient> 
      <Ingredient> 
         <Qty unit="1"/></Qty>
         <Item>demi baguette de pain par personne</Item> 
      </Ingredient> 
      <Ingredient> 
         <Item optional="1">"larme" de kirsh</Item> 
      </Ingredient> 
   </Ingredients> 
   <Instructions> 
      <Etape> Frotter le caquelon à l'aide de la gousse d'ail. Le caquelon doit être recouvert d'une fine pelicule d'ail. Jeter tous les morceaux d'ail présents dans le caquelon.</Etape> 
     <Etape> Couper les différents fromages en lamelles assez fines. Le mieux est d'alterner chaque couche de chaque fromage.</Etape>
     <Etape> Couper le pain de sorte à construire des dés (4 par tranche de baguette).</Etape> 
     <Etape> Tasser avec une spatule tout le fromage dans le caquelon.</Etape> 
     <Etape> Verser le vin blanc jusqu'à revouvrir le fromage.</Etape> 
     <Etape> Faire chauffer le caquelon. A l'aide de la spatule, amener le fromage au centre du caquelon de sorte à construire une boule homogène.</Etape>
    
<Etape> Lorsque cette boule est en partie obtenue, faire "pénétrer" le vin blanc dedans en formant des 8 avec la spatule.</Etape>
     <Etape> Quand vous avez obtenu une pâte homogène, servir chaud. Suivant les fromages vous pouvez avoir une fine pellicule blanche au sommet du caquelon.</Etape>
    
<Etape> Mettre le caquelon sur un réchaud. Piquez les cubes de pains dans une fourchette et mettez là dans le caquelon en tournant quelques tours.</Etape>
     <Etape> Déguster.</Etape> 

   </Instructions> 
</Recette>

Un peu de syntaxe

La description ci dessus utilise des termes de recette de cuisine (sémantique) et non pas des termes pour afficher cette recette (à l'écran, dans un browser, etc.).

Ce document ne précise pas la grammaire qui doit le vérifier car cette grammaire (DTD) est quasi-évidente.
La première ligne
<?xml version="1.0"?>
indique la version xml utilisée.

Les informations sont parenthésées par des balises. Ces balises peuvent contenir des attributs. Par exemple la balise Item est de la forme :
         <Item>Fromage Beaufort</Item>
c'est à dire :
BaliseDébut information BaliseFin
Mais peut aussi avoir un attribut de la forme NomAttribut="ValeurAttribut"
comme optional="1" dans :
        <Item optional="1">"larme" de kirsch</Item>
Une balise de début qui est immédiatement suivi de sa balise de fin associée comme :
<Qty unit="1"></Qty>
peut être écrite plus simplement en :
<Qty unit="1"/>

On voit clairement sur cet exemple qu'une recette de cuisine est composée d'un suite d'ingrédients et d'une suite d'étapes à effectuer pour faire la recette. Qu'un ingrédient est formé d'une quantité est d'un item, etc.
 

Parser validant et non validant

Le langage est "bien parenthésé" c'est à dire qu'une balise doit être ouverte avant d'être refermée, les balises sont emboitées les uns dans les autres, etc. Un tel document est alors dit "bien formé".
Un programme qui vérifie qu'un document XML est bien formé est appelé un parser non validant. Remarquez qu'un parser non validant valide (!!) les documents bien formés.

Mais les règles ci dessus ne suffisent pas pour décrire une recette. Que dire de :
    <Ingredient>
        <Qty unit="grammes par personne">100</Qty>
        <Qty unit="litre par personne">5</Qty>
         <Item>Fromage Beaufort</Item>
    </Ingredient>
?
Il faut donc décrire une recette avec plus de précision et c'est le rôle de sa DTD.
Un parser qui vérifie un document en le contrôlant à l'aide de sa DTD est appelé un parser validant.

XML a été conçu de sorte a pouvoir définir des documents "au fil de l'eau" sans même préciser les règles précises de ces documents hormis des régles naturelles (documents bien formés). C'est ce qui explique parfois la comparaison rapide entre HTML et XML alors qu' XML permet de définir des grammaires de documents et que HTML est l'une d'entre elles.
Les documents non associés à des DTD sont appelés DTDless.

DTD (Document Type Definition)

Une DTD indique comment définir un nouveau "markup language".

Il existe déjà beaucoup de markup language pour des domaines précis :
- pour des équations mathématiques (MathML)
- des échanges éléctroniques (XML/EDI)
- pour le multimédia (SMIL)

Voici une DTD pour des recettes de cuisine :

gramRecettes.dtd

<!-- DTD pour des recettes de cuisine -->
<!ELEMENT Recette (Nom, Remarque?, Ustensiles, Ingredients, Instructions)>
<!ELEMENT Nom (#PCDATA)>
<!ELEMENT Remarque (#PCDATA)> 
<!ELEMENT Ustensiles (Ustensile, Commentaire?)*>
<!ELEMENT Ustensile (Qty, Item)>
<!ELEMENT Ingredients (Ingredient)*>
<!ELEMENT Ingredient (Qty, Item)>
<!ELEMENT Qty (#PCDATA)> 
<!ATTLIST Qty unit CDATA #REQUIRED>
<!ELEMENT Item (#PCDATA)> 
<!ELEMENT Instructions (Step)+>

La suite des "règles" ci dessus définit le langage suivant :

Cette grammaire décrit alors clairement qu'un ingrédient est composé d'une seule quantité suivi d'un item et élimine alors le problème :
    <Ingredient>
        <Qty unit="grammes par personne">100</Qty>
        <Qty unit="litre par personne">5</Qty>
         <Item>Fromage Beaufort</Item>
    </Ingredient>

Le recette ci dessus est alors complètement décrite si on inclus ou on indique (la cas le plus courant) sa DTD. Ceci est fait par la ligne
<!DOCTYPE Recette SYSTEM "gramRecettes.dtd">
au début du fichier recette qui précise qu'une recette vérifie la grammaire décrite dans le fichier gramRecettes.dtd est commence par l'élément Recette.

La sémantique du document étant décrite, comment afficher un tel document ? Il suffit de définir des styles d'affichage pour chaque élément et c'est le travail de XSL.

XSL (eXtended Style Language)

C'est une technologie très jeune (Avril 1999 draft W3C).
En fait XSL est beaucoup plus qu'un simple langage pour le formattage de documents XML (ce que pourrait très bien faire CSS Cascading Style Sheets). Il permet de retraiter un document XML et ainsi de réarranger sa structure. En fait XSL permet de transformer un document XML et un autre document souvent XML mais pas forcément par exemple en HTML, TeX, RTF, PostScript, etc.

Nous allons transformer à l'aide de XSL la recette de cuisine fondue.xml en fichier HTML.

Un fichier XSL est constitué d'une suite de règles à appliquer sur un fichier XML. Ces règles sont appelées template. Elles comportent une élément susceptible d'être rencontré dans un fichier XML avec sa traduction associé.

Voici un exemple de règles :
<xsl:template match="/Recette">
<HTML>
<HEAD> <TITLE> <xsl:value-of select="Nom"/> </TITLE> </HEAD>
<BODY>
<H3> <xsl:value-of select="Nom"/> </H3>
<STRONG> <xsl:value-of select="Remarque"/> </STRONG>
<xsl:apply-templates/> </BODY> </HTML>
</xsl:template>

Cette règle transforme l'élement Recette par la chaîne

<HTML> <HEAD> <TITLE> suivi du texte associé à l'élément Nom (<xsl:value-of select="Nom"/>) suivi de </TITLE> </HEAD> <BODY> <H3> <STRONG> suivi du texte associé à l'élément Remarque suivi de </STRONG>. Enfin on applique toutes les transformations à faire dans le fichier XML (<xsl:apply-templates/>) et on termine par  </BODY> </HTML>.

Voici le fichier complet XSL de formattage (transformation de fondue.xml en un fichier HTML)

regles.xsl

<?xml version="1.0"?> 
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
 <xsl:template match="/Recette">
 <HTML> 
 <HEAD> <TITLE> <xsl:value-of select="Nom"/> </TITLE> </HEAD>
 <BODY> 
 <H3> <xsl:value-of select="Nom"/> </H3> 
 <STRONG> <xsl:value-of select="Remarque"/> </STRONG>
 <xsl:apply-templates/> </BODY> </HTML> 
 </xsl:template>

 <!-- Format ingredients --> 
 <xsl:template match="Ingredients"> 
 <H4>Ingredients</H4> 
 <TABLE BORDER="1"> 
 <TR BGCOLOR="#308030"><TH>Qty</TH><TH>Units</TH><TH>Item</TH></TR> <xsl:for-each 
 select="Ingredient"> 
 <TR>

 <!-- handle empty Qty elements separately --> 
 <xsl:if test='Qty[not(.="")]' > <TD><xsl:value-of select="Qty"/></TD> 
 </xsl:if>

 <xsl:if test='Qty[.=""]' > <TD BGCOLOR="#404040"> </TD> </xsl:if>

 <TD><xsl:value-of select="Qty/@unit"/></TD>
 <TD><xsl:value-of select="Item"/> <xsl:if test='Item/@optional="1"'>
 <SPAN> -- <em><STRONG>optional</STRONG></em></SPAN>
 </xsl:if> 
 </TD> </TR>
 </xsl:for-each>

 </TABLE> 
 </xsl:template>

 <!-- Format instructions --> 
 <xsl:template match="Instructions"> 
 <H4>Instructions</H4>
 <OL> <xsl:apply-templates select="Etape"/> </OL>
 </xsl:template>

 <xsl:template match="Etape"> <LI><xsl:value-of select="."/></LI>
 </xsl:template>

 <!-- ignore all not matched --> <xsl:template match="*" priority="-1"/>

 </xsl:stylesheet> 

Browsers/parsers lisant XML

XML est une technologie en plein développement (1999) et les principaux développeurs de browsers essaient actuellement (23 Janvier 2000) d'intégrer cete technique. Citons :
- Internet Explorer 5.0 de Microsoft (specification XSL)
- Mozilla ("the open source project based on the Netscape source code") peu afficher XML en utilisant CSS.

faire une demo du parsing de ma recette avec la grammaire DTD ci dessus.

Bibliographie

http://www.javaworld.com/javaworld/jw-04-1999/jw-04-xml_p.html. C'est le document qui a beaucoup inspiré l'exposé ci dessus.

http://www.w3.org/XML/

http://www.w3.org/Style/XSL/

Exposé Extensible Markup Language. Bernd Amann, équipe Vertigo/CNAM.

Une bonne FAQ à http://www.ucc.ie/xml.

XML L'expert. Natanya Pitts; ed Sybex. ISBN 2-7361-3309-9