Salta el contingut

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.