domingo, 10 de junio de 2012

Los espacios de nombre en XML

Los espacios de nombre proporcionan un método para evitar los conflictos que se pudieran producir entre los nombres de los elementos de un documento XML.

Los conflictos de nombre en XML

En XML los nombres de los elementos están definidos por el usuario. Dados varios documentos XML desarrollados por distintos autores, si los mezclamos en un único documento con cierta probabilidad se producirán conflictos entre los nombres de los distintos elementos.

Los conflictos se pueden producir, por ejemplo, entre palabras que tienen distinto significado, dependiendo del contexto en el que se utilicen; o también fruto de la casualidad si se da el caso de que dos autores utilicen los mismos nombres de etiquetas para cuestiones distintas y que no tienen nada que ver entre sí.

La página de w3schools.com propone un ejemplo basado en el distinto significado de la palabra “table” si es utilizada formando parte del lenguaje de etiquetas HTML o si se usa en un documento XML con el significado de un mueble.

Evidentemente la etiqueta “table” tiene un significado distinto según nos refiramos a su sentido en la primera rama del árbol o a la segunda rama del árbol XML.

Ejemplo nº1 Ejemplo de conflicto de nombres en un documento XML

          <?xml version="1.0" encoding="UTF-8"?>

<!-- New document created with EditiX at Fri Jun 08 17:52:21 BST 2012 -->

<!--Ejemplo de conflicto de nombres en un documento XML-->

<conflicto>
 <table>
  <tr>
   <td>ciruelas</td>
   <td>plátanos</td>
  </tr>
 </table>
 <table>
  <clase>Pino envejecido</clase>
  <medidas>
   <largo>151</largo>
   <ancho>75</ancho>
  </medidas>
 </table>
</conflicto>
        

Resolución de los conflictos de nombre

Los posibles conflictos que se pudieran producir entre los nombres elementos de un documento XML se pueden soslayar mediante la utilización de sufijos que distingan entre los nombres situados en distintas partes del documento.

En realidad, lo que conseguimos mediante la utilización de prefijos en los nombres de las etiquetas estriba en conseguir dos nombre distintos.

Ejemplo nº2 Ejemplo de una posible solución del nombres en un documento XML

          <?xml version="1.0" encoding="UTF-8"?>

<!-- New document created with EditiX at Fri Jun 08 17:52:21 BST 2012 -->

<!--Ejemplo de una posible solución del nombres en un documento XML-->

<conflicto>
 <h:table>
  <h:tr>
   <h:td>ciruelas</h:td>
   <h:td>plátanos</h:td>
  </h:tr>
 </h:table>
 <f:table>
  <f:clase>Pino envejecido</f:clase>
  <f:medidas>
   <f:largo>151</f:largo>
   <f:ancho>75</f:ancho>
  </f:medidas>
 </f:table>
</conflicto>
        

Los espacios de nombre y el atributo xmlns

Cuando se utilizan los prefijos en XML debemos definir el espacio de nombres, esa operación se lleva a cabo mediante el atributo xmlns en la etiqueta inicial de un elemento. De esa manera el procesador del documento conoce que los nombres que son descendientes de ese elemento forman un grupo con una sintaxis especial o distinta de otros grupos de elementos.

Lo explico con el símil del árbol XML: cuando colocamos un atributo xmlns en una rama del árbol XML el parser sabe que toda esa rama (todos los descendientes del primer elemento) tiene un especialidad respecto al nombre de sus elementos. Cuando un espacio de nombres se define para un elemento, todos los elementos secundarios con el mismo prefijo se asocian con el mismo espacio de nombre

La declaración de espacio de nombres tiene la siguiente sintaxis. xmlns: prefijo = " URI ".

Los espacios de nombres se pueden declarar en el primer elemento de la rama donde se utilizan o en el elemento raíz de XML.

El nombre de espacio es un identificador de recursos uniforme (URI). Normalmente el URI que se elige describe un recurso que está bajo el control del autor del documento, aunque eso no sucede siempre. Los autores, sobre todo si son empresas, suelen elegir la dirección de su página web donde, quizá, se da alguna información acerca del espacio de nombre utilizado pero, como digo, eso no es obligatorio.

Nota: El URI de espacio no es utilizado por el analizador para buscar información, simplemente lo trata como una cadena de documento y se limita a tomar nota de que los descendientes de ese elemento tienen una notación especial.

El propósito es dar el espacio de nombres un nombre único. Sin embargo, a menudo las empresa utilizan el espacio de nombres como un puntero a una página web que contiene información sobre el espacio de nombres.

Ejemplo nº3 Sintaxis de la declaración del atributo xmlns

          <?xml version="1.0" encoding="UTF-8"?>

<!-- New document created with EditiX at Fri Jun 08 17:52:21 BST 2012 -->

<!--Sintaxis de la declaración del atributo xmlns-->

<conflicto>
 <h:table xmlns:h="http://www.w3.org/TR/html4/">
  <h:tr>
   <h:td>ciruelas</h:td>
   <h:td>plátanos</h:td>
  </h:tr>
 </table>
 <f:table xmlns:f="http://metamorfosisytransformaciones.blogspot.com.es/">
  <f:clase>Pino envejecido</f:clase>
  <f:medidas>
   <f:largo>151</f:largo>
   <f:ancho>75</f:ancho>
  </f:medidas>
 </f:table>
</conflicto>
        

La declaración también se puede hacer en la raíz del documento

Ejemplo nº3 (bis) Sintaxis de la declaración del atributo xmlns en la raíz

         <?xml version="1.0" encoding="UTF-8"?>

<!-- New document created with EditiX at Fri Jun 08 17:52:21 BST 2012 -->

<!--Sintaxis de la declaración del atributo xmlns en la raiz del documento-->

<conflicto
xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://metamorfosisytransformaciones.blogspot.com.es/">
 <h:table >
  <h:tr>
   <h:td>ciruelas</h:td>
   <h:td>plátanos</h:td>
  </h:tr>
 </table>
 <f:table>
  <f:clase>Pino envejecido</f:clase>
  <f:medidas>
   <f:largo>151</f:largo>
   <f:ancho>75</f:ancho>
  </f:medidas>
 </f:table>
</conflicto>
        

Los espacios de nombre por defecto

La definición de un espacio de nombres por defecto situada en el elemento raíz de la rama a la que afecta nos permite evitar la utilización prefijos en todos los elementos secundarios. Tiene la siguiente sintaxis:

xmlns="namespaceURI"

Ejemplo nº4 Ejemplo de espacio de nombre por defecto

          <?xml version="1.0" encoding="UTF-8"?>

<!-- New document created with EditiX at Fri Jun 08 17:52:21 BST 2012 -->

<!--Ejemplo de espacio de nombre por defecto-->

<conflicto>
 <table xmlns="http://www.w3.org/TR/html4/">
  <tr>
   <td>ciruelas</td>
   <td>plátanos</td>
  </tr>
 </table>
 <table xmlns="http://metamorfosisytransformaciones.blogspot.com.es/">
  <clase>Pino envejecido</clase>
  <medidas>
   <largo>151</largo>
   <ancho>75</ancho>
  </medidas>
 </table>
</conflicto>
        

Espacios de nombres en el uso real

La definición de un espacio de nombres por defecto situada en el elemento raíz de la rama a la que afecta nos permite evitar la utilización prefijos en todos los elementos secundarios. Tiene la siguiente sintaxis:

xmlns="namespaceURI"

XSLT es un lenguaje XML que puede ser utilizado para transformar documentos XML en otros formatos, como HTML.

En el documento XSLT a continuación, puede ver que la mayoría de las etiquetas son las etiquetas HTML.

En el documento XSLT a continuación, puede ver que la mayoría de las etiquetas son las etiquetas HTML.

El documento Xslt corresponde a la entrada de este blog "Las listas simples en Xslt"

Tabla nº5 Uso del espacio de nombre por defecto en una hoja de transformación XSLT

<?xml version="1.0" encoding="UTF-8"?>
    <!-- New document created with EditiX at Tue Apr 17 00:09:53 BST 2012 -->
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:template match="islas">
    <xsl:apply-templates select="isla"/>
    </xsl:template>
    <xsl:template match="isla">
    <xsl:value-of select="position(  )"/>
    <xsl:text>. </xsl:text>
    <xsl:value-of select="."/>
    <xsl:text>
    </xsl:text>
    </xsl:template>
    </xsl:stylesheet>

No hay comentarios:

Publicar un comentario