Les éléments et attributs peuvent permettre à un développeur d'ajouter des fonctionnalités spécifiques à un document XHTML.

Le langage XHTML autorise l'ajout de composants spécifiques dans ses documents. Néanmoins, l'inclusion de ces éléments ou attributs supplémentaire obéissent à des règles strictes énoncées dans les spécifications XML.

C'est pourquoi, il est souhaitable, avant d'aborder ce cours, de prendre connaissance des instructions XML relatives à la déclaration d'éléments et d'attributs dans une Définition de Type de Document.

  1. Les éléments XML
  2. Déclaration d'éléments
  3. Les attributs
  4. Déclaration des attributs
<html>
  <body>
    <div>
      <espace_de_noms:element  nom_attribut1="valeur"
                     xmlns:espace_de_noms="http://uri.identifiant.com/">
          <espace_de_noms:sous_element1 
                                               nom_attribut2="valeur">
             Contenu...
          </espace_de_noms:sous_element1>
          <espace_de_noms:sous_element2
                                               nom_attribut3="valeur">
             Contenu...
          </espace_de_noms:sous_element2>
      </espace_de_noms:element>
    </div>
  </body>
</html>

La création d'éléments et d'attributs commence par la conception d'un module spécifique que le développeur fabriquera lui-même.

Ce module devra spécifier un nom public éventuel et un URI (Uniform Resource Identifier) indiquant son emplacement. L'exemple ci-dessous donne un aperçu d'un entête possible de module.

<!--                           Module personnel des éléments et attributs                            -->
<!--                                    Fichier : espace_de_noms-1.mod                                    -->
<!-- 
     PUBLIC "-//AUTEUR//ELEMENTS XHTML Espace_de_noms 1.0//EN"
     SYSTEM "http://uri.identifiant.com/dtD/espace_de_noms-1.mod"

   xmlns:espace_de_noms="http://uri.identifiant.com/xmlns/espace_de_noms"
-->

Eventuellement, une liste des éléments peut être également spécifiée dans l'entête du module.

<!--                        Liste des éléments du module

                   Nom                       Type             Attribut

                   element                  racine          nom_attribut
                                                                         attribut_commun

                   sous_element1    PCDATA     nom_attribut
                                                                         attribut_commun

                   sous_element2    PCDATA     nom_attribut
                                                                         attribut_commun
-->

Premièrement, il est nécessaire de déclarer un attribut d'espace de noms global.

<![%Espace_de_noms.prefixed;[
   <!ENTITY % Espace_de_noms.xmlns.attrib "%NS.decl.attrib;">
]]>

<!ENTITY % Espace_de_noms.xmlns.attrib
                   "xmlns %URI.datatype; #FIXED 
                   ’%Espace_de_noms.xmlns;’">

Deuxièmement, il faut définir un jeu commun d'attributs pour tous les éléments du module.

<!ENTITY % Espace_de_noms.Common.attrib
                  "%Espace_de_noms.xmlns.attrib;
                  nom_attribut    type_attribut    valeur_defaut>

Troisièmement, il ne reste plus qu'à déclarer les éléments et les attributs qui leurs sont affectés.

<!ELEMENT %Espace_de_noms.element.qname;
                       (%Espace_de_noms.sous_element.qname;,
                         %Espace_de_noms.sous_element2.qname;)>
<!ATTLIST %Espace_de_noms.element.qname;
                   nom_attribut1 type_attribut valeur_defaut
                   ...
                   %Espace_de_noms.Common.attrib;>

<!ELEMENT %Espace_de_noms.sous_element.qname;
                                                                                            (#PCDATA)>
<!ATTLIST %Espace_de_noms.sous_element.qname;
                   nom_attribut2 type_attribut valeur_defaut
                   ...
                   %Espace_de_noms.Common.attrib;>

<!ELEMENT %Espace_de_noms.sous_element2.qname;
                                                                                            (#PCDATA)>
<!ATTLIST %Espace_de_noms.sous_element2.qname;
                   nom_attribut3 type_attribut valeur_defaut
                   ...
                   %Espace_de_noms.Common.attrib;>

Le module, ainsi créé, pourra être appelé dans une DTD par l'intermédiaire de la commande suivante :

   <!ENTITY % Espace_de_noms.mod SYSTEM 
                                  "espace_de_noms-1.mod">

   %Espace_de_noms.mod;

ou

   <!ENTITY % Espace_de_noms.mod PUBLIC
             "-//AUTEUR//ELEMENTS XHTML Espace_de_noms 1.0//EN"
             "http://uri_identifiant.com/dtD/espace_de_noms-1.mod">

   %Espace_de_noms.mod;