Mais avant tout, il faut que vous sachiez une chose, c'est qu'on peut mélanger plusieurs langages XML. Et ça croyez moi, c'est vraiment cool :) .

Le problème

C'est là que survient le premier problème. Imaginons que nous voulons générer du SVG (graphisme vectoriel) avec Xslt. Les deux langages ont une balise <text/>. Or, comment le programme qui traitera notre document pourra savoir que ce <text/>-ci est un élément SVG et que celui-là appartient au langage Xslt ? C'est pour éviter ce genre de problème qu'on appelle collision de nom (c'est beau, on se croirait en physique nucléaire :D ), que les namespaces ont été inventés.

La notion de namespace

Le mécanisme de namespace, qu'on peut traduire par "espace de nom", ou "domaine nominal", est une notion assez abstraite.
Un namespace lui-même est abstrait. C'est une chaîne de caractères (une adresse internet, mais elle n'est pas lue) qui sert à identifier le langage auquel appartient la balise, ou l'attribut qui fait partie de ce namespace.
Mais c'est tellement abstrait qu'il vaut mieux un exemple, sinon je vais pas m'en sortir. :-°

La technique

Tout d'abord, il faut déclarer le namespace grâce à l'attribut réservé xmlns. Par exemple, pour le XHtml, on fait :

<html xmlns="http://www.w3.org/1999/xhtml">

Il faut avouer que ça ne nous avance pas à grande chose... Comment faire pour inclure du MathML (langage XML pour décrire des équations mathématiques) ? Ajouter un second attribut xmlns est interdit (il est interdit d'y avoir deux attributs ayant le même nom).

On va donc déclarer un préfixe pour un namespace, qui comme son nom l'indique se placera avant un nom de balise ou d'attribut, et dire que toutes les balises et tous les attributs portant ce préfixe appartiennent au namespace précisé, et donc à un langage spécifique.

Pour déclarer un namespace et un préfixe, on utilise la syntaxe suivante, toujours avec l'attribut xmlns :

xmlns:prefixe="adresse-du-namespace"

On a une totale liberté sur le choix du préfixe.
Ensuite, on l'utilise comme ceci sur les balises et les attributs :

<prefixe:balise prefixe:attribut="truc pif paf pouf"/>

Simplissime, n'est-ce pas ?

Avec du XHtml, cela nous donnera donc :

<frites:html xmlns:frites="http://www.w3.org/1999/xhtml" frites:lang="en">
<frites:head>
<!-- etc etc -->
</frites:head>
<frites:body>
<frites:p>
<frites:a frites:href="http://www.siteduzero.com">Cours XHtml/css, php et C++</frites:a>
</frites:p>
</frites:body>
</frites:html>

Pour simplifier la chose, on peut enlever les préfixes des attributs : si aucun préfixe n'est associé à un attribut, il appartient au même namespace que l'élément auquel il appartient. Ce qui nous donne :

<frites:html xmlns:frites="http://www.w3.org/1999/xhtml" lang="en">
<frites:head>
<!-- etc etc -->
</frites:head>
<frites:body>
<frites:p>
<frites:a href="http://www.siteduzero.com">Cours XHtml/css, php et C++</frites:a>
</frites:p>
</frites:body>
</frites:html>

Maintenant, pour inclure un autre langage, du MathML par exemple, il suffit de déclarer son namespace avec un autre préfixe, comme ceci :

<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:mathml="http://www.w3.org/1998/Math/MathML" lang="en">
<xhtml:head>
<!-- etc etc -->
</xhtml:head>
<xhtml:body>
<xhtml:p>
<mathml:math>
  <mathml:msup>
    <mathml:msqrt>
      <mathml:mrow>
        <mathml:mi>a</mathml:mi>
        <mathml:mo>+</mathml:mo>
        <mathml:mi>b</mathml:mi>
      </mathml:mrow>
    </mathml:msqrt>
    <mathml:mn>27</mathml:mn>
  </mathml:msup>
</mathml:math>
</xhtml:p>
</xhtml:body>
</xhtml:html>

Les informaticiens étant des fainéants, ils ont trouvé un moyen de simplifier ce mécanisme. Si on écrit :

xmlns="http://www.machin.org"

alors on considère que l'élément qui porte cette déclaration et ses descendants appartiennent à ce namespace ! En réécrivant le code ci-dessus, ça donne :

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:mathml="http://www.w3.org/1998/Math/MathML" lang="en">
<head>
<!-- etc etc -->
<head>
<body>
<p>
<mathml:math>
  <mathml:msup>
    <mathml:msqrt>
      <mathml:mrow>
        <mathml:mi>a</mathml:mi>
        <mathml:mo>+</mathml:mo>
        <mathml:mi>b</mathml:mi>
      </mathml:mrow>
    </mathml:msqrt>
    <mathml:mn>27</mathml:mn>
  </mathml:msup>
</mathml:math>
</p>
</body>
</html>

En suivant la même règle, on peut écrire :

<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<!-- etc etc -->
<head>
<body>
<p>
<math xmlns="http://www.w3.org/1998/Math/MathML">
  <msup>
    <msqrt>
      <mrow>
        <mi>a</mi>
        <mo>+</mo>
        <mi>b</mi>
      </mrow>
    </msqrt>
    <mn>27</mn>
  </msup>
</math>
</p>
</body>
</html>

En fait, c'est assez intuitif :) .

Et ça a l'avantage d'être très puissant.
Malheureusement, les navigateurs ne sont pas à l'heure actuelle (fin 2005) vraiment capables d'exploiter ce mécanisme...

L'auteur