Zona HTML Zona Java Zona PHP Zona ASP Zona Bases de datos
Inicio > Tutoriales > Internet > XML > SVG y VML > Curso de XML
-Tutoriales

Curso de XML


Introducción a los Namespaces

. Presentación

Una de las pruebas del éxito del XML es la gran cantidad de vocabularios XML (DTD) que están apareciendo. En algunas ocasiones al realizar nuestros documentos XML nos podremos encontrar en la necesidad de utilizar varios de estos vocabularios. Es posible que estemos escribendo un artículo científico en formato XML y que tengamos la necesidad de incorporar fórmulas matemáticas. Podemos perfectamente desarrollar nuestras propias etiquetas, pero ¿por qué no utilizar las que nos proporciona el vocabulario MathML? Sin duda, es mejor la reutilización de estas marcaciones que el hecho de reinventar unas nuevas.

Por tanto, estos documentos XML que contendrán elementos de múltiples fuentes independientes entre sí, pueden tener problemas de reconocimiento y colisión. Puede ser que estemos utilizando dos vocabularios que utilizan el mismo tipo de elemento o nombre de atributo. Por ejemplo:

<?xml version=1.0" encoding="iso-8859-1"?>
<direccion>
  <calle>Avd. Diagonal 8</calle>
  <ciudad>Barcelona</ciudad>
  <provincia>Barcelona</ciudad>
  <pais>España</pais>
</direccion>
<?xml version=1.0" encoding="iso-8859-1"?>
<servidor>
  <url>http://www.palotes.com</url>
  <direccion>123.45.67.8</direccion>	
</servidor>

Los dos documentos XML anteriores tienen en común el elemento direccion. Por el momento son dos vocabularios diferentes pero puede ser que en algún momento tengamos que integrarlos en un mismo documento XML. Supongamos que ambos documentos juntos nos ofrecen información sobre la localización de una empresa: su dirección física y su dirección en Internet. Está claro que el elemento dirección va a provocar problemas. Podríamos renombrarlo y en el segundo documento XML llamarlo ip-servidor, pero no es una buena solución. Una posible solución es ponerlo de la siguiente manera:

<?xml version=1.0" encoding="iso-8859-1"?>
<empresa>
  <nombre>Palotes S.A.</nombre>
  <dirfis:direccion xmlns:dirfis="http://www.palotes.com/direccionfisica">
    <dirfis:calle>Avd. Diagonal 8</dirfis:calle>
    <dirfis:ciudad>Barcelona</dirfis:ciudad>
    <dirfis:provincia>Barcelona</dirfis:ciudad>
    <dirfis:pais>España</dirfis:pais>
  </dirfis:direccion>
  <dirserv:servidor xmlns:dirserv="http://www.palotes.com/direccionservidor">
    <dirserv:url>http://www.palotes.com</dirserv:url>
    <dirserv:direccion>123.45.67.8</dirserv:direccion>	
  </dirserv:servidor>
</empresa>

En la que como podemos observar los elementos de ambos vocabularios están bien diferenciados.

También puede ocurrir que sean diferentes, pero que el software que trabaja con ellos necesite diferenciarlos claramente, ya que su procesamiento requiere comportamientos diferentes.

Por ejemplo, esto es un documento XHTML que incorpora el vocabulario MathML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Ejemplo de documento MathML</title>
  <meta http-equiv="Content-Type" content="text/html" />
</head>

<body>
<p>Ecuación de segundo grado escrita con MathML</p>
<math xmlns="http://www.w3.org/1998/Math/MathML">
  <mrow>
    <mi>a</mi>
    <msup>
      <mi>x</mi>
      <mn>2</mn>
    </msup>
    <mo>+</mo>
    <mi>bx</mi>
    <mo>+</mo>
    <mi>c</mi>
    <mo>=</mo>
    <mn>0</mn>
    <mi></mi>
    <mo>,</mo>
    <mi>con a</mi>
    <mo>></mo>
    <mn>0</mn>
  </mrow>
</math>
</body>
</html>

Hemos diferenciado los elementos del vocabulario XHTML y MathML para que luego,por ejemplo el buscador Amaya sea capaz de pintarlos adecuadamente.

O,por ejemplo, una XSLT (la estudiaremos en los próximos capítulos) es un vocabulario XML mediante el cual convertimos un documento XML en otro XML. El código del documento XML de salida va implícito en la XSLT, que a su vez es un vocabulario XML. Por tanto,es evidente diferenciar un vocabulario de tal manera que el procesador de XSLT sea capaz de identificar qué elementos pertenecen al lenguaje XSLT para procesarlos. La forma de hacerlo es la siguiente:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="direccion">
  <!-- El elemento direccion no pertenece al vocabulario de la XSLT -->
  <direccion>
    <xsl:apply-templates/>
  </direccion>
</xsl:stylesheet>

Estas consideraciones requieren ,por tanto, que las construcciones de documentos posean nombres universales, cuyo ámbito se extienda más allá del documento que las contiene. Por tanto el mecanismo mediante el cual se puede llevar a cabo esta identificación es lo que se describe en la especificación de los namespaces (traducido podría ser "espacios de nombre").

. ¿Qué es exactamente un "namespace"?

. Definición de "namespace"

Por tanto, un "namespace" XML es una colección de nombres, identificados por un URI, que se utiliza en los documentos XML para identificar los nombres de los elementos y atributos.

. Declaración de un "namespace"

Como podemos observar en el ejemplo, la declaración del "namespace" se realiza mediante el atributo xmlns, cuyo valor es un URI que identifica de forma unívoca el nombre.

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

El atributo xmlns puede ir seguido del carácter dos puntos :, opcional, y el nombre del "namespace":

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

Entonces este nombre xsl, será el prefijo de los elementos de este vocabulario XML xsl:template.

Si no colocamos el carácter dos puntos y este nombre, entonces el nombre del "namespace" es indicado por el nombre del elemento que tiene el atributo xmlns.

<math xmlns="http://www.w3.org/1998/Math/MathML">

En este caso, el nombre del namespace es math

Cada elemento se identifica con el namespace de dos maneras:

  • Incluyéndolo como prefijo del nombre del elemento.
  • <dirfis:direccion xmlns:dirfis="http://www.palotes.com/direccionfisica">
      <dirfis:calle>Avd. Diagonal 8</dirfis:calle>
    
  • En el caso de no declararlo implicitamente, se considera que es un"namespace" por defecto y en tal caso el elemento en el que se especifica y todos los elementos que contiene llevarán asociados ese "namespace".
  • <math xmlns="http://www.w3.org/1998/Math/MathML">
      <mrow>
        ......
      </mrow>
    </math>	
    	

. Ambito del "namespace"

Denominamos ámbito del "namespace" al grupo de elementos y atributos a los que afecta el "namespace". Por regla general el "namespace" es aplicable al elemento en que se especifica y a todos los elementos dentro del contenido de ese elemento.

<dirserv:servidor xmlns:dirserv="http://www.palotes.com/direccionservidor">
  <dirserv:url>http://www.palotes.com</dirserv:url>
  <dirserv:direccion>123.45.67.8</dirserv:direccion>	
</dirserv:servidor>

Siempre y cuando no sea anulado por otra declaración de "namespace"

[<![CDATA[<html xmlns="http://www.w3.org/1999/xhtml">
.....
<body>
...
<math xmlns="http://www.w3.org/1998/Math/MathML">
  <mrow>
    .....
  </mrow>
</math>
</body>
</html>

El "namespace" html afecta al elemento body pero no al elemento mrow al tener como padre el elemento math, en el cual se ha definido el "namespace" por defecto math.

. Direcciones

Para más información sobre el tema, podéis visitar las siguientes direcciones:

 
Patrocinados
 

Copyright © 1999-2006 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad

Hospedaje web y servidores dedicados linux por Ferca Network