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;