Como vimos anteriormente, de una forma o de otra es necesarios resolver el conflicto entre un elemento title definido en slideshow.dtd y el definido en xhtml.dtd. En el ejercicio anterior, subrayamos el nombre para ponerlo en un "espacio de nombres" diferente. En esta secci�n, veremos c�mo suar el espacio de nombres de XML est�ndard para hacer algo sin renombrar el elemento.
|
Nota:
En este momento, los analizadores Java XML no soportan nombres de espacios. Esta secci�n es s�lo para informaci�n. |
El objetivo principal de la especificaci�n de nombres de espacios es permitir que el autor del documento le diga al analizador qu� DTD usar cuando analice un elemento dado. El analizador puede entonces consultar el DTD para una definici�n de elemento. Por supuesto, tambi�n es importante evitar que el analizador aborte cuando se encuentra una definici�n de "duplicado", y que todav�a siga generando errores si el documento referencia un elemento sin cualificar.
|
Nota:
Los espacios de nombres se aplican tanto a atributos como a elementos. En esta secci�n, s�lo hemos considerado elementos. Para m�s informaci�n sobre los atributos, puedes ver la especificaci�n en http://www.w3.org/TR/REC-xml-names/. |
�Definir un Espacio de Nombres
Para definir un espacio de nombres al que pertenece un elemento, es necesario a�adir un atributo a la definici�n del elemento, donde el nombre del atributo sea xmlns ("xml namespace"). Por ejemplo, podr�amos hacer esto en slideshow.dtd a�adiendo una entrada como la siguiente en la lista de definici�n de atributos del elemento title.
<!ELEMENT title (%inline;)*> <!ATTLIST title xmlns CDATA #FIXED "http://www.example.com/slideshow" >
Declarar el atributo como FIXED tiene varias caracter�sticas importantes.
- Evita que el documento especifique cualquier valor no correspondiente al atributo xmlns (como se describe en Definir atributos en un DTD).
- El elemento definido en este DTD se hace �nico (como el analizador entiende el atributo xmlns), por eso no genera conflictos con un elemento que tenga el mismo nombre en otro DTD. Esto permite que m�ltiples DTDs usen el mismo nombre de elemento sin generar un error del analizador.
- Cuando un documento especifica el atributo xmlns para una etiqueta, el documento selecciona la definici�n de elemento con un atributo correspondiente.
Cada nombre de elemento en nuestro DTD obtendr�a extamente el mismo atributo con el mismo valor. Observa que estamos usando un string CDATA para suministrar el URI. En este caso, hemos especificado una URL. Pero podr�amos haber especificado una URN, posiblemente especificando un permiso como urn: en lugar de http:.
�Referenciar un Espacio de Nombres
Cuando un documento usa un nombre de elemento que existe s�lo en uno de los ficheros .dtd que referencia, el nombre no necesita estar cualificado. Pero cuando se usa un nombre de elemento que tiene varias definiciones, se necesita alguna suerte de cualificaci�n.
|
Nota:
Un nombre de elemento est� siempre cualificado para su espacio de nombres por defecto, seg�n se defina en el nombre del fichero DTD en que el reside. Mientras que haya s�lo una definici�n para el nombre, la cualificaci�n est� impl�cita. |
Cualificamos una referencia a un nombre de elemento especificando el atributo xmlns, como se ve aqu�:
<title xmlns="http://www.example.com/slideshow"
Overview
</title>
El espacio de nombres se aplica a ese elemento, y a cualquier elemento contenido dentro de �l.
�Definir un Prefijo de Espacio de Nombres
Cuando s�lo necesitamos una referencia a un espacio de nombres, no es mucho trabajo, pero cuando necesitamos hacer la misma referencia varias veces, a�adir el atributo xmlns se convierte en pesado. Tambi�n hace dificil cambiar el nombre del espacio de nombres m�s tarde.
La alternativa es definir un prefijo de espacio de nombres, que es tan secillo como especificar xmlns, dos puntos (:) y el nombre del prefijo antes del valor del atributo, como se ve aqu�:
<sl:slideshow xmlns:sl='http:/www.example.com/slideshow'
...>
...
</sl:slideshow>
Esta definici�n configura sl como un prefijo que puede usarse para cualificar 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, como se ve aqu�.
|
Nota:
El URI del espacio de nombres puede contener caracteres que no est�n permitidos en un nombre XML, por eso no puede usarse directamente como prefijo. La definici�n de prefijo asocia un nombre XML con la URI, lo que permite usar el nombre del prefijo en su lugar. Lo que hace m�s sencillo cambiar las referencias a la URI en el futuro. |
Cuando el prefijo se usa para cualificar un nombre de elemento, la etiqueta final tambi�n incluye el prefijo, como se muestra aqui:
<sl:slideshow xmlns:sl='http:/www.example.com/slideshow'
...>
...
<slide>
<sl:title>Overview<sl:title>
</slide>
...
</sl:slideshow>
Finalmente podemos observar que se pueden definir varios prefijos en el mismo elemento, como se muestra aqu�:
<sl:slideshow xmlns:sl='http:/www.example.com/slideshow'
xmlns:xhtml='urn:...'>
...
</sl:slideshow>
Con esta clase de arreglo, todos las definiciones de prefijos est�n juntas en un lugar, y podemos usarlas en cualquier lugar en el que se necesiten en el documento. Este ejemplo tambi�n sugiere el uso de URN para definir el prefijo xhtml, en lugar de una URL. Esta definici�n permitir�a a la aplicaci�n referenciar una copia local del DTD XHTML o alguna versi�n copiada, con un potencial impacto ben�fico sobre el rendimiento.