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.
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.
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.
<?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>
|
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.
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.
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 :
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.
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 -->
<!-- handle empty Qty elements separately
-->
<xsl:if test='Qty[.=""]' > <TD BGCOLOR="#404040"> </TD> </xsl:if> <TD><xsl:value-of
select="Qty/@unit"/></TD>
</TABLE>
<!-- Format instructions -->
<xsl:template match="Etape">
<LI><xsl:value-of select="."/></LI>
<!-- ignore all not matched --> <xsl:template match="*" priority="-1"/> </xsl:stylesheet> |
faire une demo du parsing de ma recette avec la grammaire DTD ci dessus.
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