Les entités

Introduction

Jusque là, nous n'avons étudié la DTD que du point de vue de la validation de document (ce qui est bien normal puisqu'il s'agit de son rôle premier). Il est cependant possible d'y inclure d'autres éléments et en particulier la déclaration d'entités (externes ou internes).
Cela vous permettra, notamment, de créer des alias afin de remplacer un "mot clé" par une chaîne de caractères complexe ou susceptible de changer ou encore par le contenu intégral d'un fichier.
Mais avant de commencer, sachez que lorsque la DTD d'un document se limite à la déclaration d'entités (ou bien est à peine plus complexe) celle-ci peut être intégrée au document XML (comme nous le ferons dans les exemples suivants).
Dans ce cas, il faut remplacer
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE nomracine SYSTEM "nomdtd.dtd">
<nomracine>
</nomracine>
par
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE nomracine [<!-- contenu de la DTD -->]>
<nomracine>
</nomracine>

Entité interne (1/2)

La déclaration d'une entité interne se fait sous la forme <!ENTITY nomentite value>.
Vous pouvez alors y faire référence dans un document XML simplement en utilisant la notation &nomentite;.
Votre document XML pourra alors ressembler à
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE nomracine [
   <!ENTITY copyright "(c) copyright 2002">
]>
<nomracine>
   Utilisation d'une entité interne : &copyright;
</nomracine>
qui sera équivalent à
<?xml version="1.0" encoding="ISO-8859-1"?>
<nomracine>
   Utilisation d'une entité interne : (c) copyright 2002;
</nomracine>
comme le prouve l'application de la feuille de style suivante
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" version="1.0" encoding="ISO-8859-1"/>
    <xsl:template match="/">
<xsl:apply-templates />
    </xsl:template>

<xsl:template match="nomracine">
<xsl:value-of select="text()" />
    </xsl:template>
</xsl:stylesheet>
qui retourne le résultat

   Utilisation d'une entité interne : (c) copyright 2002
Dans le cas d'un long document comportant quels éléments pouvant varier régulièrement cela peut être intéressant d'isoler comme cela certaines chaînes de caractères. Mais cela peut également être pratique pour la manipulation de caractères spéciaux comme nous le verrons à l'instant.

Entité interne (2/2)

Vous connaissez déjà la posibilité d'utiliser dans les documents XML les notations &lt; (signe inférieur), &gt; (signe supérieur), &amp; (et commercial), &apos; (apostrophe) et &quot; (guillemet) qui sont tous prédéfinis, mais qu'en est-il des autres caractères comme par exemple le signe copyright (©) ?
Pour insérer ce type de caractère au sein de votre texte vous avez la posibilité d'insérer directement son code ASCII sous la forme &#169; (ici le code ASCII du signe copyright) mais il est généralement plus pratique de déclarer une entité interne correspondant à ce signe (on pourra alors choisir comme nom de cette entité celui qui est utilisé pour les caractères spéciaux HTML).
Voici donc un exemple d'utilisation
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE nomracine [
   <!ENTITY copy "&#169;">
]>
<nomracine>
   Utilisation d'une entité interne : &copy; 2002
</nomracine>
qui retournera (après application de la feuille de style présentée précédemment) le résultat suivant

   Utilisation d'une entité interne : © 2002

Entité externe

Alors que les entités internes nous ont permis de faire référence à des chaînes de caractères définies au sein de la DTD (ou du document XML), les entités externes vont nous permettre de faire référence à des fichiers externes.
La déclaration d'une entité externe se fait de la façon suivante <!ENTITY nomentite SYSTEM nomfichier> et vous pouvez y faire référence (comme pour une référence interne) par &nomentite;.
Le fichier suivant
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE nomracine [
   <!ENTITY autresection SYSTEM "entiteexterne_inc.xml">
]>
<nomracine>
   <section name="section1">
       Une première partie du document XML
   </section>
   &autresection;
</nomracine>
qui fait référence à
<?xml version="1.0" encoding="ISO-8859-1" ?>
<section name="autresection">
   Une autre section du document, déclarée dans un fichier isolé.
</section>
est alors équivalent à
<?xml version="1.0" encoding="ISO-8859-1"?>
<nomracine>
    <section name="section1">
        Une première partie du document XML
    </section>
    <section name="autresection">
        Une autre section du document, déclarée dans un fichier isolé.
    </section>
</nomracine>

Remarques:

  1. L'entité externe doit (dans ce cas) être un document XML bien formé (ce qui signifie en particulier qu'il ne doit contenir qu'une seule balise racine) on parle alors d'entité "parseable".
  2. L'entité externe ne peut contenir ou faire référence à une DTD