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