Les langages XML/XSL

L'auteur de cette page est : Jean-Baptiste Yunes

Voici une DTD (Définition de Type de Document) ou grammaire :

<?xml version="1.0" encoding="iso-8859-1"?>
<!ELEMENT document (entete,corps)>

<!ELEMENT entete (titre,auteur,description,motcle*)>

<!ELEMENT titre (#PCDATA)>
<!ELEMENT auteur (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT motcle (#PCDATA)>

<!ELEMENT corps (chapitre+)>
<!ELEMENT chapitre (section+)>
<!ATTLIST chapitre titre CDATA #REQUIRED>

<!ELEMENT section (#PCDATA)>
<!ATTLIST section titre CDATA #REQUIRED>

Cette grammaire indique qu'un document conforme à la définition est constitué d'une entête suivie d'un corps. L'entête doit inclure dans l'ordre : un titre, un auteur, une description et une liste non vide de mots clés. Le corps est constitué d'une liste non vide de chapitre, chacun d'eux contenant une liste non vide de section. Les chapitres et sections doivent posséder un attribut titre.

La grammaire précédente permet d'exprimer par exemple le document XML (eXtensible Markup Language) suivant :

<?xml version='1.0' encoding="iso-8859-1"?>
<!DOCTYPE document SYSTEM "test.dtd">
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<document>
<entete>
  <titre>Cours HTML</titre>
  <auteur>Jean-Baptiste Yunès</auteur>
  <description>Vous trouverez ici un cours HTML</description>
  <motcle>cours</motcle>
  <motcle>HTML</motcle>
  <motcle>cours HTML</motcle>
</entete>
<corps>
  <chapitre titre="Les normes">
    <section titre="HTML 4.01">
      Il s'agit du document de base.
    </section>
    <section titre="XHTML 1.0">
      Reformulation de HTML 4.01 en XML.
    </section>
  </chapitre>
  <chapitre titre="Le langage">
    <section titre="L'entête">
      C'est la balise HEAD
    </section>
    <section titre="Le corps">
      C'est la balise BODY
    </section>
  </chapitre>
</corps>
</document>

On remarque que ce document est conforme à la définition précédente. De plus certaines instructions permettent de lier le document à la DTD qui lui correspond ainsi qu'à un document très particulier : une feuille de style permettant de lui associer un filtre.

La conformité du document XML vis-à-vis de la DTD peut être vérifiée en utilisant xerces.

On peut ensuite définir une transformation du document XML en HTML en utilisant un document XSL (eXtensible Stylesheet Language) (XML conforme à une certaine DTD) :

<?xml version='1.0' encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
    <xsl:apply-templates select="document"/>
  </xsl:template>

  <xsl:template match="document">
    <html>
    <xsl:apply-templates select="entete"/>
    <xsl:apply-templates select="corps"/>
    </html>
  </xsl:template>

  <xsl:template match="entete">
      <head>
	<title>
		<xsl:apply-templates select="titre"/>
		<xsl:apply-templates select="auteur"/>
	</title>
      <xsl:element name="meta">
        <xsl:attribute name="name">description</xsl:attribute>
	<xsl:attribute name="content">
	  <xsl:apply-templates select="description"/>
        </xsl:attribute>
      </xsl:element>
      </head>
  </xsl:template>

  <xsl:template match="titre">
		<xsl:value-of select="text()" />
  </xsl:template>
  <xsl:template match="auteur">
		(Auteur : <xsl:value-of select="text()" />)
  </xsl:template>

  <xsl:template match="description">
		<xsl:value-of select="text()" />
  </xsl:template>

  <xsl:template match="corps">
      <body>
        <p><span style="color: red;">Mots-clés : </span>
        <xsl:for-each select="/document/entete/motcle">
          <b><xsl:value-of select="text()" /></b>
          <xsl:if test="not(position()=last())">
            <xsl:text>,</xsl:text>
          </xsl:if>
        </xsl:for-each>
        </p>
        <p><span style="color: red;">Description : </span>
	   <xsl:apply-templates select="/document/entete/description"/>
	</p>
        <xsl:apply-templates select="chapitre"/>
      </body>
  </xsl:template>

  <xsl:template match="chapitre">
      <h1 style="color blue;"><xsl:value-of select="@titre" /></h1>
      <xsl:apply-templates select="section"/>
  </xsl:template>

  <xsl:template match="section">
      <h2 style="color: green"><xsl:value-of select="@titre" /></h2>
      <xsl:value-of select="text()" />
  </xsl:template>

</xsl:stylesheet>

Nous pouvons observer que ce document (assez peu lisible à première vue) permet de traduire les documents XML conformes à la DTD donnée en documents HTML. L'idée étant d'opérer une réécriture de l'arbre décrit par le document XML. Voici le résultat produit par xalan :

<html>
<head>
<META   http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Cours HTML
		(Auteur : Jean-Baptiste Yunès)
  </title>
<meta name="description" content="Vous trouverez ici un cours HTML">
</head>
<body>
<p>
<span style="color: red;">Mots-clés : </span><b>cours</b>,<b>HTML</b>,<b>cours HTML</b>
</p>
<p>
<span style="color: red;">Description : </span>Vous trouverez ici un cours HTML</p>
<h1 style="color: blue;">Les normes</h1>
<h2 style="color: green">HTML 4.01</h2>
      Il s'agit du document de base.
    <h2 style="color: green">XHTML 1.0</h2>
      Reformulation de HTML 4.01 en XML.
    <h1 style="color: blue;">Le langage</h1>
<h2 style="color: green">L'entête</h2>
      C'est la balise HEAD
    <h2 style="color: green">Le corps</h2>
      C'est la balise BODY
    </body>
</html>

Vous pouvez observer un résultat similaire construit pour Internet Explorer qui est capable d'interpréter du XML (MSXML); uniquement si sa version est au moins 5.0, pour cela cliquez.

L'autre comportement qu'il est possible d'observer est celui de Netscape 6 (aka Mozilla) qui supporte XML et les feuilles de style. En voici un exemple

Sinon vous pouvez observer le résultat produit par xalan : cliquez.