Espais de Noms XML
El problema dels conflictes de noms
Quan es combinen documents XML de fonts diferents, és possible que els mateixos noms d'elements tinguin significats diferents. Per exemple:
<!-- Document de facturació -->
<taula>
<fila><columna>Producte</columna><columna>Preu</columna></fila>
</taula>
<!-- Document de mobles -->
<taula tipus="fusta">
<pota/>
<tauler/>
</taula>
L'element <taula> té significats completament diferents en cada context. Quan es mesclen els dos vocabularis en un mateix document, cal un mecanisme per evitar la col·lisió: els espais de noms (namespaces).
Qué és un espai de noms?
Un espai de noms XML és un mecanisme per associar els noms d'elements i atributs amb un identificador únic (un URI), evitant ambigüitats quan es combinen vocabularis de fonts diverses.
L'especificació va ser publicada pel W3C el 1999: Namespaces in XML 1.0.
Declaració d'espais de noms
Un espai de noms es declara amb l'atribut especial xmlns o xmlns:prefix:
<!-- Espai de noms per defecte (sense prefix) -->
<factura xmlns="http://www.empresa.com/facturacio">
<total>100.00</total>
</factura>
<!-- Espai de noms amb prefix -->
<fac:factura xmlns:fac="http://www.empresa.com/facturacio">
<fac:total>100.00</fac:total>
</fac:factura>
L'URI NO és una URL
L'URI que identifica un espai de noms no ha de ser una pàgina web accessible. És simplement un identificador únic. Per convenció s'usa format URL perquè les organitzacions controlen els seus propis dominis, però l'XML no fa cap petició HTTP a aquella adreça.
<!-- URIs comunes d'espais de noms -->
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:html="http://www.w3.org/1999/xhtml"
Espai de noms per defecte
Quan es declara un espai de noms sense prefix (xmlns="..."), tots els elements sense prefix del document pertanyen a aquell espai de noms.
<?xml version="1.0" encoding="UTF-8"?>
<comanda xmlns="http://www.botiga.cat/comandes">
<!-- Tots aquests elements pertanyen a l'espai de noms de comandes -->
<id>CMD-001</id>
<client>Joan García</client>
<data>2026-06-01</data>
<linia>
<producte>Teclat mecànic</producte>
<quantitat>1</quantitat>
<preu>85.00</preu>
</linia>
</comanda>
Múltiples espais de noms
El cas més habitual és combinar vocabularis en un sol document:
<?xml version="1.0" encoding="UTF-8"?>
<root
xmlns:fac="http://www.empresa.com/facturacio"
xmlns:cli="http://www.empresa.com/clients"
xmlns:prod="http://www.empresa.com/productes">
<fac:factura id="F2026001">
<cli:client>
<cli:nom>Maria López</cli:nom>
<cli:nif>12345678A</cli:nif>
</cli:client>
<fac:linies>
<fac:linia>
<prod:producte ref="P-001">
<prod:descripcio>Ordinador portàtil</prod:descripcio>
<prod:preu>899.00</prod:preu>
</prod:producte>
<fac:quantitat>2</fac:quantitat>
</fac:linia>
</fac:linies>
<fac:total>1798.00</fac:total>
</fac:factura>
</root>
Herència d'espais de noms
Una declaració de namespace s'aplica a l'element on es declara i a tots els seus descendents (tret que es sobreescrigui):
<document xmlns="http://exemple.com/doc">
<!-- Tot aquest contingut pertany a http://exemple.com/doc -->
<seccio>
<titol>Secció 1</titol>
<para xmlns="http://exemple.com/text">
<!-- A partir d'aquí, l'espai per defecte canvia -->
<contingut>Text de la secció</contingut>
</para>
<!-- Aquí torna a ser http://exemple.com/doc -->
<titol>Secció 2</titol>
</seccio>
</document>
Espais de noms estàndard importants
| Prefix convencional | URI | Ús |
|---|---|---|
xsl |
http://www.w3.org/1999/XSL/Transform |
XSLT |
xs / xsd |
http://www.w3.org/2001/XMLSchema |
XML Schema |
xsi |
http://www.w3.org/2001/XMLSchema-instance |
Instàncies XSD |
html |
http://www.w3.org/1999/xhtml |
XHTML |
svg |
http://www.w3.org/2000/svg |
SVG |
math |
http://www.w3.org/1998/Math/MathML |
MathML |
atom |
http://www.w3.org/2005/Atom |
Atom (sindicació) |
Atributs i espais de noms
Els atributs sense prefix no pertanyen a cap espai de noms (ni al per defecte). Això és diferent dels elements:
<fac:factura xmlns:fac="http://www.empresa.com/facturacio"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="factura.xsd"
id="F001">
<!--
fac:factura pertany a l'espai http://www.empresa.com/facturacio
id (sense prefix) NO pertany a cap espai de noms
xsi:noNamespaceSchemaLocation pertany a l'espai xsi
-->
</fac:factura>
Bones pràctiques
- Declara tots els namespaces a l'element arrel per tenir-los centralitzats
- Usa prefixos descriptius i consistents (xsl, xs, html...)
- Evita canviar el namespace per defecte en subelements; confon els lectors
- El namespace per defecte s'usa quan el vocabulari és el majoritari del document
Miniactivitat
Crea un document XML que combini dades d'una escola: assignatures (namespace escola) i professors (namespace rrhh). Cada assignatura ha de tenir una referència al professor que la imparteix.