Les entités internes et externes - XML Facile!

9.Les entités internes et externes

9.1.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>

9.2.Entité interne

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"?>
<!DOCTYPE nomracine [
   <!ENTITY copyright "(c) copyright 2002">
]>
<nomracine>
   Utilisation d'une entité interne : &copyright;
</nomracine>
qui sera équivalent à
<?xml version="1.0"?>
<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"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" version="1.0"/>
    <xsl:template match="/">
		<xsl:apply-templates />
    </xsl:template>

    <xsl:template match="nomracine">
	<xsl:value-of select="." />
    </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 quelques é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.
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"?>
<!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