Los espacios de nombres (namespaces) son uno de los pilares que conforman los cimientos de XML.
Los espacios de nombres (namespaces) son uno de los pilares que conforman los cimientos de XML.
En general, en informática, un namespace o espacio de nombres es un medio para organizar clases dentro de un entorno, agrupándolas de un modo más lógico y jerárquico. Por ejemplo, si estamos desarrollando un conjunto de clases para las operaciones de gestión de una biblioteca, podemos ir escribiendo todas las clases y situarlas dentro de una misma aplicación o DLL (biblioteca). Supongamos que tenemos dos clases para operaciones de gestión de préstamos, denominadas Titulo y Fecha, y otras dos clases para operaciones de compra, denominadas Factura y Precio.
Si necesitáramos añadir una clase más para las compras que registre el título del libro, el nombre más idóneo sería Titulo, pero este nombre ya está siendo utilizado, así que para evitar problemas de duplicidad, deberíamos elegir otro que puede que no se ajuste a definir la funcionalidad de la clase.
Este problema se solucionaría mediante el uso de espacios de nombre que, además, permite organizar mejor cada clase, ya que podemos asignarle un nombre jerárquico para la funcionalidad que desempeña. De esta forma, podríamos crear un namespace con el nombre Gestion, que contuviera otros dos namespaces llamados Prestamo y Compra, para finalmente incluir en cada uno de ellos las clases correspondientes.
El concepto de espacio de nombre en lenguaje XML es similar, pero difiere en dos puntos fundamentales: las versiones de XML no tienen estructura interna y no se trata, matemáticamente hablando, de un conjunto.
Los espacios de nombres permiten eliminar las ambigüedades y solucionar los problemas de homonimia que se producen en los documentos, ya que en un mismo documento existen palabras con el mismo nombre (p.e. "capital"), pero con diferentes significados y espacios semánticos (término geográfico/término económico-financiero). Veamos un ejemplo en el que se produce ambigüedad:
capital | capital |
<país nombre="españa">
<capital>madrid</capital> </país> |
<inversión>
<capital>2000€</capital> </inversión> |
Ante la ambigüedad, surgió la pregunta de cómo combinar en un mismo documento varios vocabularios.
<inversiones>
<país nombre="España">
<capital>Madrid</capital>
<capital>2000€</capital>
Una posible solución era asignar un nombre único a cada etiqueta creando una autoridad mundial que asignara dicho nombre, pero un solución mucho más fácil era utilizar un mecanismo ya existente, por eso se pensó en los URIs. Un URI es un identificador global único. Aquí no se trata de utilizar un URI como enlace, ni tiene por qué tener contenido, los URI sólo se utilizan para que el nombre sea único. Ejemplo: http://www.hipertexto.info
Los nombres de espacio (namespaces) establecidos en la especificación del W3 Consortium Namespaces in XML (http://www.w3.org/TR/REC-xml-names/) sirven para proveer un método simple para calificar los nombres que se usan en los documentos XML por asociación con los namespaces identificados por URI (Uniform Resource Identifier). Este Identificador de Recursos Uniforme es un método que combina URNs y URLs, esto es, nombres/direcciones y que sirve para identificar de forma universal recursos de todo tipo que existen la la World Wide Web.
En nuestro ejemplo, la solución estaría en asociar a cada etiqueta un URI que indicara a qué espacio de nombres pertenece:
[http:www.bolsa.es]:capital [http:www.geograf.com]:capital
Por ejemplo, de la siguiente forma:
<[http://www.bolsa.es]:inversiones> <[http://www.geograf.com]:país <[http://www.geograf.com]:nombre="España"> <[http://www.geograf.com]:capital>Madrid <[http://www.geograf.com]:capital>> <[http://www.bolsa.es]:capital>>2000€ <[http://www.bolsa.es]:capital>> <[http://www.bolsa.es]:país> . . . <[http://www.bolsa.es]:inversiones>
Es muy importante tener en cuenta que los URIs sólo se utilizan para que el nombre sea único, no son enlaces, ni tienen que contener información, sin embargo, también los URIs sirven para acceder a recursos. Los XML Namespaces describen cómo se puede asociar una URI con cada etiqueta y atributo en un documento XML, si bien, para qué se utiliza el URI depende de la aplicación que lea el URI. Por ejemplo, RDF, (http://www.w3.org/TR/REC-rdf-syntax/) el estándar del W3C para metadatos, lo usa para enlazar cada metadato a un archivo definiendo el tipo de ese metadato).
En nuestro ejemplo, la solución está en asociar un alias a los elementos de un espacio de nombres dentro de un ámbito:
xmlns:alias define alias en el ámbito de un elemento <bolsa:inversiones xmlns:bolsa="http://www.bolsa.es" xmlns:geograf="http://www.geograf.com"> <geograf:país geograf:nombre="España"> <geograf:capital>Madrid</geograf:capital> <bolsa:capital>2000€</bolsa:capital> </geograf:país> . . . </bolsa:inversiones>
Además, es posible una asignación dinámica, esto es, ir asociando espacios de nombre a los elementos según van apareciendo:
<bolsa:inversiones xmlns:bolsa="http://www.bolsa.es"> <geograf:país xmlns:geograf="http://www.geograf.com" geograf:nombre="España"> <geograf:capital>Madrid</geograf:capital> <bolsa:capital>2000€</bolsa:capital> </geograf:país> . . . </bolsa:inversiones>
También es posible establecer un espacio de nombres por defecto (sin alias) mediante xmlns="..."
<inversiones xmlns="http://www.bolsa.es"> <geograf:país xmlns:geograf="http://www.geograf.com" geograf:nombre="España"> <geograf:capital>Madrid</geograf:capital> <capital>2000€</capital> </geograf:país> . . . </inversiones> Se refiere a http://www.bolsa.es
Los espacios de nombre nacieron con posterioridad a los DTDs y por eso las Declaraciones de Tipo de Documento no dan soporte a los espacios de nombre. Si combinamos varios documentos, por ejemplo, una hoja de cálculo .xml con nombres de países y otra con inversiones (con sus correspondientes DTD), y queremos mezclar ambas páginas, habrá elementos que no se llamen igual, pero otros que sí (como capital). La única solución es que el autor de cada documento le diga al analizador o parser que estemos utilizando qué DTD usar cuando analice un elemento dado. Es decir, que para una etiqueta se especifica qué DTD usar, por lo que esto sólo tiene sentido si se usa más de un DTD. Entonces se usarían ambos DTD y utilizaríamos los espacios de nombre para distinguir aquellos elementos en los que no esté claro a qué DTD pertenecen. De esta forma, hay que definir los espacios de nombre usados para poderlos validar con DTDs:
<!DOCTYPE inversiones [ <!ELEMENT inversiones (geograf:país*)> <!ELEMENT geograf:país (geograf:capital,capital) > <!ELEMENT geograf:capital (#PCDATA)> <!ELEMENT capital (#PCDATA)> <!ATTLIST inversiones xmlns CDATA #FIXED "http://www.bolsa.es"> <!ATTLIST geograf:país geograf:nombre CDATA #REQUIRED xmlns:geog CDATA #FIXED "http://www.geograf.com"> ]>
Así pues, los espacios de nombres se usan para combinar vocabularios y facilitan la incorporación de elementos no previstos inicialmente.
Los espacios de nombres se crearon para que no existieran colisiones entre los diferentes módulos de software que eran capaces de reconocer las marcaciones (etiquetas y atributos) del lenguaje XML ya que los diferentes documentos que contienen marcaciones de distintas fuentes independientes entre sí, solían tener problemas de reconocimiento cuando habían sido creados para otros programas de software que, sin embargo, utilizaban el mismo tipo de elemento o nombre de atributo.
Una de las motivaciones para esta modularidad es que, si existe un conjunto de marcaciones disponibles, que son entendibles y para las que existe software útil disponible, es mejor la reutilización de estas marcaciones que el hecho de reinventar unas nuevas. Así, se consideró que las construcciones de documentos debían tener nombres universales, cuyo ámbito se extendiera más allá del documento que las contuviera. La especificación Namespaces XML describe un mecanismo, los espacios de nombres XML, que lleva a cabo esta misión.
Un espacio de nombres XML es una colección de nombres, identificados por una referencia URI (RFC 2396), que se utiliza en los documentos XML como tipos de elementos (element types) y nombres de atributos (attribute names).
Los espacios de nombres se aplican tanto a atributos como a elementos. Para definir un espacio de nombres al que pertenece un elemento, es necesario añadir un atributo a la definición de elemento, donde el nombre del atributo sea xmlns ("xml namespace") y el valor puede ser una cadena cualquiera, aunque por convención suelen ser URLs. Por ejemplo, podemos hacer esto añadiendo una entrada como la siguiente en la lista de definición de atributos de un elemento title:
<!ELEMENT title (%inline;)*> <!ATTLIST title xmlns CDATA #FIXED "http://www.ejemplos.xml/muestra"
Los nombres de los espacios de nombres XML pueden aparecer como nombres calificados, que contienen el carácter "dos puntos", separando el nombre en un prefijo de espacio de nombres y su parte local. El prefijo, que es mapeado a un URI, selecciona un espacio de nombres. La combinación de los URIs de espacios de nombres universalmente gestionados y el espacio de nombres propio del documento produce unos identificadores que garantizan la unicidad universal.
Cuando un documento usa un nombre de elemento que existe sólo en uno de los archivos DTD que referencia, el nombre no necesita estar calificado, pero cuando se usa un nombre de elemento que tiene varias definiciones, se necesita algún tipo de calificación (por ejemplo, capital referido a países versus capital referido a inversiones).
Calificamos una referencia a un nombre de elemento especificando el atributo xmlns, como se ve a continuación:
<title xmlns="http://www.ejemplos.com/muestra" > Tutorial </title>
El espacio de nombres se aplica a ese elemento, y a cualquier elemento contenido dentro de él.
Usando el atributo xmls, cuando necesitamos una sola referencia a un espacio de nombres, la tarea es fácil, pero cuando necesitamos hacer la misma referencia varias veces, añadir dicho atributo se convierte en una tarea tediosa que también hace difícil cambiar el nombre del espacio de nombres, en caso de que se quiera modificar posteriormente.
La alternativa es definir un prefijo de espacio de nombres, que es tan sencillo como especificar xmlns:nombre del prefijo antes del valor del atributo, como se ve a continuación:
<mt:muestra xmlns:mt='http://www.ejemplos/muestra ...> ... </mt:muestra>
Esta definición configura mt como un prefijo que puede usarse para calificar el nombre del elemento actual y cualquier elemento dentro de él. Como el prefijo puede usarse en cualquier elemento contenido, tiene más sentido definirlo en el elemento raíz del documento XML.
Cuando el prefijo se usa para calificar un nombre de elemento, la etiqueta o marca final también debe incluir el prefijo, tal y como se muestra en este ejemplo:
<mt:muestra xmlns:mt='http://www.ejemplos/muestra ...> ... <uno> <mt:title> Tutorial <mt:title> </uno> ... </mt:muestra>
También es posible definir varios prefijos en el mismo elemento, de la siguiente forma:
<mt:muestra xmlns:mt='http://www.ejemplos/muestra xmlns:chtml="urn: ..."> ... </mt:muestra>
En el siguiente ejemplo, tenemos información sobre libros en XML, pero, a su vez, es posible usar HTML para mostrar la información:
<h:html xmlns:xdc="http://www.biblioteca.com/revistas" xmlns:h="http://www.libreria.org/HTML/html"> <h:head><h:title>La revista ecologista</h:title></h:head> <h:body> <xdc:revistas> <xdc:title>XML: A Primer</xdc:title> <h:table> <h:tr align="center"> <h:td>Author</h:td><h:td>Price</h:td> <h:td>Pages</h:td><h:td>Date</h:td></h:tr> <h:tr align="left"> <h:td><xdc:author>Pepe Lopez</xdc:author></h:td> <h:td><xdc:price>4,5</xdc:price></h:td> <h:td><xdc:pages>42</xdc:pages></h:td> <h:td><xdc:date>2004/03</xdc:date></h:td> </h:tr> </h:table> </xdc:revistas> </h:body> </h:html>
En el ejemplo anterior, los elementos que tiene el prefijo xdc están asociados a un espacio de nombres cuyo identificador es http://www.biblioteca.com/revistas, mientras que los que tienen el prefijo h están asociados con un espacio de nombres cuyo identificador es http://www.libreria.org/HTML/html.
Si no se especifica el carácter dos puntos y el nombre del espacio de nombres, entonces el nombre de espacio de nombres asociado es el del espacio de nombres por defecto en el ámbito del elemento al que está adjunto la declaración. El efecto de dicha declaración es anular cualquier declaración de nivel superior del espacio de nombres por defecto, estableciendo su valor a "nulo".
Ejemplo de declaración de espacio de nombres:
<?xml version="1.0"?> <x xmlns:edi='http://ecommerce.org/schema'> <!-- el espacio de nombres edi se aplica al elemento "x" y a su contenido --> </x>
Se considera que la declaración de espacios de nombres es aplicable al elemento en que se especifica y a todos los elementos dentro del contenido de ese elemento, a menos que sea anulado por otra declaración de espacio de nombres, con la misma parte del prefijo:
<?xml version="1.0"?> <!-- todo aquí esta explícitamente en el espacio de nombres HTML --> <html:html xmlns:html='http://www.w3.org/TR/REC-html40'> <html:head><html:title>Pronóstico</html:title></html:head> <html:body><html:p>Movido <html:a href='http://frob.com'>aquí</html:a></html:p></html:body> </html:html>
Se pueden declarar múltiples prefijos de espacios de nombres como atributos de un único elemento, como se muestra en el siguiente ejemplo:
<?xml version="1.0"?> <!-- ambos prefijos de espacio de nombres están disponibles a continuación --> <lb:libro xmlns:lb='urn:loc.gov:libros' xmlns:isbn='urn:ISBN:0-395-36341-6'> <lb:titulo>Más barato que una Docena</lb:titulo> <isbn:numero>1568491379</isbn:numero> </lb:libro>
Un espacio de nombres por defecto se aplica al elemento donde está declarado (si ese elemento no posee prefijo de espacio de nombres), y a todos los elementos sin prefijo dentro del contenido del ese elemento. Los espacios de nombres por defecto no se aplican directamente a los atributos. El espacio de nombres de un atributo sin prefijo es una función del tipo del elemento al cual está adjunto, y al espacio de nombres (si hubiese alguno) de ese elemento.
<?xml version="1.0"?> <!-- otra vez, todo está en el espacio de nombres HTML, por defecto --> <html xmlns='http://www.w3.org/TR/REC-html40'> <head><title>Pronóstico</title></head> <body><p>Movido <a href='http://frob.com'>aquí</a>.</p></body> </html>
<?xml version="1.0"?> <!-- los nombres no prefijados pertenecen a "libros" --> <libro xmlns='urn:loc.gov:libros' xmlns:isbn='urn:ISBN:0-395-36341-6'> <titulo>Más barato que una Docena</titulo> <isbn:numero>1568491379</isbn:numero> </libro>
Un documento XML es parte de un conjunto de documentos XML que son lógicamente equivalentes sin un contexto de aplicación, pero que varían en la representación física basada en los cambios sintácticos permitidos por XML 1.0 [XML] y Namespaces en XML [Names].
La especificación del W3C llamada Canonical XML (http://www.w3.org/TR/xml-c14n), describe un método para generar una representación física, la forma canónica, de un documento XML que dé cuenta de los cambios permitidos. Excepto en algunos casos inusuales, si dos documentos tienen la misma forma canónica, entonces los dos documentos son lógicamente equivalentes sin un contexto de aplicación dado. Nótese que dos documentos pueden tener diferentes formas canónicas aunque sigan siendo equivalentes en un contexto dado basado en unas reglas de equivalencia sobre una aplicación específica para la que no está generalizada la especificación XML.
En resumen, los espacios de nombres sirven para evitar las colisiones entre elementos del mismo nombre, y en general, para distinguir los distintos grupos de elementos en un mismo documento. Cada espacio de nombres se asocia con una URI, que sólo sirve como identificador único y no tiene por qué ser válida.
Título: Hipertexto, el nuevo concepto de documento en la cultura de la imagen
Autora: María Jesús Lamarca Lapuente (currículo personal)
© 1997 - - La Güeb de Joaquín | |||||
Joaquín Medina Serrano
|
|||||
|
Codificación | |
Fecha de creación | |
Última actualización | |