|
||
Espacios de nombres en XML 1.1 Este documento es una traducción de la Recomendación del W3C sobre los espacios de nombres en XML 1.1 La versión inglesa de esta especificación es la única con valor normativo y puede encontrarse en: http://www.w3.org/TR/xml-names11/ |
Consulte la sección de erratas de este documento, que puede incluir algunas correcciones normativas.
Vea también las traducciones.
Este documento también está disponible en estos formatos no normativos: XML.
Copyright © 2004 W3C® (MIT, ERCIM, Keio), Todos los derechos reservados. Se aplican todas las normas de responsabilidad, marcas comerciales, uso de documentos, y licencias de software del W3C.
Esta sección describe el estado de este documento al momento de su publicación. Este documento pueden ser reemplazado por otros. Una lista de las publicaciones actuales del W3C y la última revisión de este informe técnico puede hallarse en el Índice de informes técnicos del W3C en http://www.w3.org/TR/.
Este documento es una Recomendación del W3C. Ha sido revisado por miembros del W3C y otras partes interesadas, y avalado por el Director como Recomendación del W3C. Es un documento estable y puede ser empleado como material de referencia o citado como referencia normativa a otro documento. El papel del W3C en la creación de la Recomendación es atraer la atención hacia la especificación y fomentar su amplia implementación. Esto mejora la funcionalidad y la interoperabilidad de la Web.
Este documento es resultado de la Actividad de XML del W3C. La versión inglesa de esta especificación es la única versión normativa. Sin embargo, podrá hallar traducciones de este documento en http://www.w3.org/2003/03/Translations/byTechnology?technology=xml-names11.
Se puede hallar documentación de propiedad intelectual posiblemente relevante a esta recomendación en la página pública de divulgación de derechos de propiedad intelectual del Grupo de Trabajo.
Las implementaciones conocidas están documentadas en el Informe de implementación de espacios de nombres 1.1. También está disponible un paquete de prueba en la página del Paquete de prueba XML.
Por favor informe de los errores en este documento a xml-names-editor@w3.org; hay archivos públicos disponibles. La lista de erratas para este documento se encuentra disponible en http://www.w3.org/XML/2004/xml-names11-errata.
1 Motivación y síntesis
1.1 Comentario sobre notación y uso
2 Espacios de nombres de XML
2.1 Conceptos básicos
2.2 Uso de IRI como nombres de espacios de nombres
2.3 Comparación de referencias de IRI
3 Declaración de espacios de nombres
4 Nombres cualificados
5 Uso de nombres cualificados
6 Aplicación de espacios de nombres a elementos y atributos
6.1 Ámbito de aplicación de espacios de nombre
6.2 Espacios de nombre por defecto
6.3 Unicidad de atributos
7 Conformidad de documentos
8 Conformidad de procesadores
9 Identificadores de recursos internacionalizados (Internationalized Resource Identifiers, IRI)
A Referencias normativas
B Otras referencias (no normativas)
C Estructura interna de los espacios de nombres XML (no normativo)
D Cambios desde la versión 1.0 (no normativo)
E Agradecimientos (no normativo)
Estas consideraciones exigen que las estructuras de los documentos deban tener nombres estructurados de modo tal de evitar colisiones entre nombres de distintos vocabularios de marcado. Esta especificación describe un mecanismo, espacios de nombre XML, que logra esto al asignar nombres expandidos a elementos y atributos.
En todos los casos en que aparecen DESTACADAS, las palabras clave DEBE, NO DEBE, OBLIGATORIO, DEBERÍA, NO DEBERÍA, PUEDE en este documento interpretarse según se describe en [Palabras clave.
Nótese que muchos de los símbolos no terminales de las producciones de esta especificación no están definidos aquí, sino en la especificación XML [XML]. Cuando los símbolos no terminales aquí definidos tienen los mismos nombres que los símbolos no terminales definidos en la especificación XML, las producciones de esta especificación corresponden en todos los casos a un subconjunto de las cadenas emparejadas por las producciones correspondientes de la especificación XML.
En las producciones de este documento, el código NSC
es una "Restricción del espacio de nombres" (Namespace Constraint), una de las reglas que DEBEN seguir los documentos conformes con esta especificación.
[Definición: Un espacio de nombre XML es identificado mediante una referencia IRI; los nombres de elemento y atributo pueden ser colocados en un espacio de nombre XML mediante los mecanismos descritos en esta especificación. ]
[Definición: Un nombre expandido es un par constituido por un nombre de espacio de nombre y un nombre local. ] [Definición: Para un nombre N en un espacio de nombre identificado mediante un IRI I, el nombre del espacio de nombre es I. Para un nombre N que no está en un espacio de nombre, el nombre del espacio de nombre no tiene asignación de valor. ] [Definición: En ambos casos el nombre local es N. ] Es esta combinación del espacio de nombre IRI manejado universalmente y los nombres locales del vocabulario la que resulta efectiva para evitar las colisiones de nombres.
Las referencias IRI pueden contener caracteres que no están permitidos en los nombres, y frecuentemente son inconvenientemente largas, de manera que los nombres expandidos no son usados directamente para nombrar elementos y atributos en los documentos XML. En cambio, se utilizan nombres cualificados. [Definición: Un nombre cualificado es un nombre sujeto a la interpretación del espacio de nombre. ] En los documentos que se adecuan a esta especificación, los nombres de elementos y atributos aparecen como nombres cualificados. Sintácticamente, son nombres con prefijo o nombres sin prefijo. Se provee una sintaxis de declaración basada en atributos para vincular los prefijos a los nombres de espacio de nombre y para vincular un espacio de nombre por defecto que se aplica a los nombres de elementos sin prefijo; éstas declaraciones están limitadas a los elementos en los cuales aparecen, de modo que pueden darse distintas vinculaciones en distintas partes de un documento. Los procesadores que se adecuen a esta especificación DEBEN reconocen y actúan sobre estas declaraciones y prefijos.
Esta desaprobación de las referencias URI relativas fue decidida mediante una Votación Plenaria de XML del W3C [Desaprobación de URI relativos]. También declara que "las especificaciones posteriores tal como DOM, XPath, etc. no definen interpretación para ellas".
Las referencias IRI que identifican nombres de espacio se comparan para determinar si un nombre pertenece a un espacio de nombre dado, y si dos nombres pertenecen al mismo espacio de nombre. [Definición: Los dos IRI son tratados como cadenas, y son idénticos si y sólo si las cadenas son idénticas, esto es, si son la misma secuencia de caracteres. ] La comparación toma en cuenta mayúsculas y minúsculas, y no se hace ni deshace ningún escape por %.
Como consecuencia de esto, las referencias IRI que no son idénticas en este sentido pueden resolverse de la misma manera. Algunos ejemplos incluyen las referencias IRI que sólo difieren en mayúsculas o minúsculas, o en caracteres de escape por %, o que están en entidades externas con distintos URI base (pero nótese que los IRI relativos son desaprobados como nombres de espacio de nombre).
En una declaración de espacio de nombre, la referencia IRI es el valor normalizado del atributo, de modo que el reemplazo de las referencias XML de carácter y entidad ya ha sido realizado antes de cualquier comparación.
Ejemplos:
Las siguientes referencias IRI son todas diferentes en lo que hace a identificar espacios de nombre, pues difieren en mayúsculas/minúsculas:
http://www.example.org/wine
http://www.Example.org/wine
http://www.example.org/Wine
Las siguientes referencias IRI también son todas diferentes en lo referente a identificar espacios de nombre:
http://www.example.org/rosé
http://www.example.org/ros%c3%a9
http://www.example.org/ros%c3%A9
http://www.example.org/ros%C3%a9
http://www.example.org/ros%C3%A9
Y también las siguientes:
http://www.example.org/~wilbur
http://www.example.org/%7ewilbur
http://www.example.org/%7Ewilbur
Si la entidad eacute ha sido definida como é, todos los siguientes tags de inicio contienen declaraciones de espacio de nombre que vinculan el prefijo p a la misma referencia IRI, http://example.org/rosé
.
<p:foo xmlns:p="http://example.org/rosé">
<p:foo xmlns:p="http://example.org/rosé">
<p:foo xmlns:p="http://example.org/rosé">
<p:foo xmlns:p="http://example.org/rosé">
<p:foo xmlns:p="http://example.org/rosé">
Debido al riesgo de confusión entre IRI que serían equivalentes en caso de estar sin referencias, se rechaza el uso de caracteres %-escape en los nombres de espacio de nombre.
[Definición: Un espacio de nombre (o más precisamente, un vínculo de espacio de nombre) se declara utilizando un conjunto de atributos reservados. Este nombre de atributo debe ser xmlns o comenzar con xmlns:. Estos atributos, como cualquier otro atributo XML, se pueden proporcionar directamente o pueden tener un valor por defecto. ]
[1] | NSAttName | ::= | PrefixedAttName | |
| DefaultAttName | ||||
[2] | PrefixedAttName | ::= | 'xmlns:' NCName | [NSC: Prefijos y nombres de espacio de nombre reservados] |
[3] | DefaultAttName | ::= | 'xmlns' | |
[4] | NCName | ::= | NCNameStartChar NCNameChar* | /* Un nombre XML, menos los ":" */ |
[5] | NCNameChar | ::= | NameChar - ':' | |
[5a] | NCNameStartChar | ::= | NameStartChar - ':' |
El valor normalizado del atributo DEBE ser una referencia IRI - el nombre de espacio de nombre que identifica al espacio de nombre - o una cadena vacía. El nombre del espacio de nombre, para servir a la finalidad deseada, DEBERÍA tener las características de unicidad y persistencia. El objetivo es que no sea directamente usable para la obtención de un esquema (si es que existe alguno). Un ejemplo de una sintaxis diseñada con estos fines en mente es el de los Nombres Uniformes de Recursos [RFC2141]. Sin embargo, debería tenerse en cuenta que los URL ordinarios pueden utilizarse de modo tal que se alcancen estos mismos objetivos.
[Definición: Si el nombre de atributo concuerda con PrefixedAttName, entonces el NCName da el prefijo del espacio de nombre, usado para asociar nombres de elementos y atributos con el nombre del espacio de nombre dado por el valor del atributo en el ámbito del elemento al cual está ligada la declaración.]
[Definición: Si el nombre del atributo concuerda con DefaultAttName, entonces el nombre de espacio de nombre dado por el valor del atributo es aquel del espacio de nombres por defecto en el ámbito del elemento al cual está ligada la declaración.] En 6 Aplicando espacios de nombre a elementos y atributos se habla de los espacios de nombres por defecto y de la anulación de declaraciones.
Un ejemplo de declaración de espacio de nombres, que asocia el prefijo del espacio de nombres edi con el nombre de espacio de nombres http://ecommerce.example.org/schema
:
<x xmlns:edi='http://ecommerce.example.org/schema'> <!-- el prefijo "edi" está ligado a http://ecommerce.example.org/schema para el elemento "x" y sus contenidos ---> </x>
En los documentos XML que se adecuen a esta especificación, algunos nombres (estructuras correspondientes al símbolo no terminal Name) DEBEN serdados como nombres cualificados, según se define a continuación:
[6] | QName | ::= | PrefixedName |
| UnprefixedName | |||
[6a] | PrefixedName | ::= | Prefix ':' LocalPart |
[6b] | UnprefixedName | ::= | LocalPart |
[7] | Prefix | ::= | NCName |
[8] | LocalPart | ::= | NCName |
ElPrefijo proporciona la parte del prefijo del espacio de nombre del nombre cualificado, y DEBE estar asociado mediante una referencia IRI a un espacio de nombres en una declaración de espacio de nombre. [Definición: LocalPart proporciona la parte local del nombre cualificado.]
Obsérvese que el prefijo actúa únicamente como sustituto del nombre del espacio de nombres. Las aplicaciones DEBERÍAN usar el nombre del espacio de nombres, y no el prefijo, al construir nombres cuyo ámbito de aplicación vaya más allá del documento que lo contiene.
En los documentos XML conformes a esta especificación, los nombres de elementos se dan como nombres cualificados, según se describe a continuación:
[9] | STag | ::= | '<' QName (S Attribute)* S? '>' | [NSC: Prefijo declarado] |
[10] | ETag | ::= | '</' QName S? '>' | [NSC: Prefijo declarado] |
[11] | EmptyElemTag | ::= | '<' QName (S Attribute)* S? '/>' | [NSC: Prefijo declarado] |
Un ejemplo de nombre cualificado que funciona como nombre de elemento:
Los atributos, son declaraciones de espacios de nombres, o bien sus nombres se dan como nombres cualificados:
[12] | Attribute | ::= | NSAttName Eq AttValue | |
| QName Eq AttValue | [NSC: Prefijo declarado] |
Un ejemplo de nombre cualificado que funciona como nombre de atributo:
Restricción sobre el espacio de nombres: Prefijo Declarado]
El prefijo del espacio de nombres, a menos que sea xml
o xmlns
, DEBE haber sido declarado en un atributo de declaración de espacio de nombres ya sea en la etiqueta inicial del elemento en que se usa el prefijo, o en un elemento ascendiente (es decir, un elemento en cuyo contenido aparezca el marcado prefijado). Además, el valor del atributo en la declaración más interna NO DEBE ser una cadena vacía.
Esta restricción puede ocasionar dificultades operativas en aquellos casos en que el atributo de declaración de espacio de nombres no se proporcione directamente en la entidad documento XML, sino a través de un atributo por defecto declarado en una entidad externa. Estas declaraciones pueden no ser leídas por programas basados en un procesador de XML no validador. Muchas aplicaciones XML, entre ellas presumiblemente algunas sensibles a los espacios de nombres, no requieren el uso de procesadores validadores. Para el funcionamiento correcto de tales aplicaciones, las declaraciones de espacios de nombres DEBEN proporcionarse directamente o bien a través de atributos por defecto declarados en el subconjunto interno del DTD.
Los nombres de elementos y nombres de atributos también se dan como nombres cualificados cuando aparecen en declaraciones en el DTD:
[13] | doctypedecl | ::= | '<!DOCTYPE' S QName (S ExternalID)? S? ('[' (markupdecl | PEReference | S)* ']' S?)? '>' |
[14] | elementdecl | ::= | '<!ELEMENT' S QName S contentspec S? '>' |
[15] | cp | ::= | (QName | choice | seq) ('?' | '*' | '+')? |
[16] | Mixed | ::= | '(' S? '#PCDATA' (S? '|' S? QName)* S? ')*' |
| '(' S? '#PCDATA' S? ')' | |||
[17] | AttlistDecl | ::= | '<!ATTLIST' S QName AttDef* S? '>' |
[18] | AttDef | ::= | S (QName | NSAttName) S AttType S DefaultDecl |
El nombre expandido correspondiente a un nombre de elemento o atributo prefijado tiene la IRI, a la cual el prefijo está vinculado como su nombre de espacio de nombres, y la parte local como su nombre local.
<?xml version="1.1"?> <html:html xmlns:html='http://www.w3.org/1999/xhtml'> <html:head><html:title>Frobnostication</html:title></html:head> <html:body><html:p>Moved to <html:a href='http://frob.example.com'>here.</html:a></html:p></html:body> </html:html>
Se pueden declarar varios prefijos de espacios de nombres como atributos de un mismo elemento, como se muestra en este ejemplo:
<?xml version="1.1"?>
<!-- ambos prefijos de espacios de nombres están disponibles en todas partes -->
<bk:book xmlns:bk='urn:loc.gov:books'
xmlns:isbn='urn:ISBN:0-395-36341-6'>
<bk:title>Cheaper by the Dozen</bk:title>
<isbn:number>1568491379</isbn:number>
</bk:book>
El valor del atributo en una declaración de espacio de nombres para un prefijo PUEDE estar vacío. Esto tiene el efecto, dentro del ámbito de la declaración, de quitar cualquier asociación del prefijo con un nombre de espacio de nombres. Posteriores declaraciones PUEDEN redeclarar el prefijo nuevamente:
<?xml version="1.1"?>
<x xmlns:n1="http://www.w3.org">
<n1:a/> <!-- legal; el prefijo está vinculado a http://www.w3.org -->
<x xmlns:n1="">
<n1:a/> <!-- ilegal; el prefijo n1 no está vinculado aquí -->
<x xmlns:n1="http://www.w3.org">
<n1:a/> <!-- legal; el prefijo n1 está vinculado nuevamente -->
</x>
</x>
</x>
El ámbito de una declaración de espacio de nombres por defecto se extiende desde el comienzo de la etiqueta inicial, en la cual aparece, hasta el final de la última etiqueta correspondiente, excluyendo el ámbito de cualquier declaración interna de espacio de nombre por defecto. En caso de una etiqueta vacía, el ámbito es la etiqueta misma.
Una declaración de espacio de nombres por defecto se aplica a todos los nombres de elementos sin prefijo dentro de su ámbito. Las declaraciones de espacio de nombres por defecto no se aplican directamente a los nombres de atributos; la interpretación de atributos sin prefijo está determinada por el elemento en el cual aparecen.
Si hay una declaración de espacio de nombres por defecto, el nombre expandido que corresponde a un nombre de elemento sin prefijo tiene la IRI del espacio de nombre por defecto como su nombre del espacio de nombre. Si no hay declaración de espacio de nombres por defecto en ámbito, el nombre del espacio de nombres no tiene valor asignado. El nombre del espacio de nombres para un nombre de atributo sin prefijo siempre carece de valor asignado. En todos los casos, el nombre local es la parte local (que por supuesto es igual al nombre mismo sin prefijo).
<?xml version="1.1"?> <!-- los elementos están en el espacio de nombre HTML, en este caso por defecto --> <html xmlns='http://www.w3.org/1999/xhtml'> <head><title>Frobnostication</title></head> <body><p>Movido a <a href='http://frob.example.com'>aquí</a>.</p></body> </html>
<?xml version="1.1"?>
<!-- los tipos de elementos sin prefijo son de "books" -->
<book xmlns='urn:loc.gov:books'
xmlns:isbn='urn:ISBN:0-395-36341-6'>
<title>Cheaper by the Dozen</title>
<isbn:number>1568491379</isbn:number>
</book>
Un ejemplo más desarrollado que ilustra el ámbito de los espacios de nombres:
<?xml version="1.1"?> <!-- inicialmente, el espacio de nombres por defecto es "books" --> <book xmlns='urn:loc.gov:books' xmlns:isbn='urn:ISBN:0-395-36341-6'> <title>Cheaper by the Dozen</title> <isbn:number>1568491379</isbn:number> <notes> <!-- hacemos a HTML el espacio de nombres por defecto para algunos comentarios --> <p xmlns='http://www.w3.org/1999/xhtml'> Este es un libro <i>divertido</i> ! </p> </notes> </book>
El valor del atributo en una declaración de espacio de nombres por defecto PUEDE estar vacío. Esto tiene el mismo efecto, dentro del ámbito de la declaración, que si no hubiera espacio de nombres por defecto.
<?xml version='1.1'?> <Beers> <!-- el espacio de nombres por defecto es ahora el de HTML --> <p xmlns='http://www.w3.org/1999/xhtml'> <th><td>Name</td><td>Origin</td><td>Description</td></th> <tr> <!-- dentro de las celdas de la tabla no hay espacio de nombres por defecto --> <td><brandName xmlns="">Huntsman</brandName></td> <td><origin xmlns="">Bath, UK</origin></td> <td> <details xmlns=""><class>Bitter</class><hop>Fuggles</hop> <pro>Wonderful hop, light alcohol, good summer beer</pro> <con>Fragile; excessive variance pub to pub</con> </details> </td> </tr> </table> </Beers>
tengan nombres cualificados con la misma parte local y con prefijos que hayan sido ligados a nombres de espacios de nombres que sean idénticos.
Esta restricción es equivalente a exigir que ningún elemento tenga dos atributos con el mismo nombre expandido.
Por ejemplo cada una de las etiquetas iniciales mal
que sigue es ilegal:
<!-- http://www.w3.org está ligado a n1 y n2 --> <x xmlns:n1="http://www.w3.org" xmlns:n2="http://www.w3.org" > <mal a="1" a="2" /> <mal n1:a="1" n2:a="2" /> </x>
Sin embargo, las siguientes son legales, la segunda porque el espacio de nombres por defecto no se aplica a los nombres de atributos:
<!-- http://www.w3.org está ligado a n1 y es el valor por defecto --> <x xmlns:n1="http://www.w3.org" xmlns="http://www.w3.org" > <bien a="1" b="2" /> <bien a="1" n1:a="2" /> </x>
Esta especificación se aplica a los documentos XML 1.1. Para adecuarse a esta especificación, un documento DEBE estar bien formado de acuerdo con la especificación XML 1.1 [XML 1.1].
En documentos XML conformes con esta especificación, los nombres de elementos y atributos DEBEN concordar con la producción dada para QName y DEBEN satisfacer las "Restricciones sobre los espacios de nombres". Todos los restantes símbolos en el documento, que son OBLIGATORIOS para la conformidad con XML 1.1, para coincidir con la producción XML para Name, DEBEN concordar con la producción de esta especificación para NCName.
[Definición: Un documento está bien formado en espacio de nombres se se adecua a esta especificación. ]
Se sigue que en un documento bien formado en espacio de nombres:
Todos los nombres de elementos y atributos contienen cero o un símbolo de dos puntos (:).
Ningún nombre de entidad, destinos de instrucción de procesamiento, o nombre de notación contiene algún símbolo de dos puntos (:).
Además, un documento bien formado en espacio de nombres también puede ser válido en espacio de nombres.
[Definición: Un documento bien formado en espacio de nombres es válido en espacio de nombres si es válido de acuerdo con la especificación XML 1.1, y todos los símbolos aparte de nombres de elementos y atributos que sean OBLIGATORIOS, para validez XML 1.1, coincidan con la producción XML para Name, coincidan con la producción de esta especificación para NCName. ]
Un documento válido en espacio de nombres:
Ningún atributo con un tipo declarado de ID, IDREF(S), ENTITY(IES), o NOTATION contiene algún símbolo de dos puntos (:).
[Definición: Un procesador XML validador que se adecue a esta especificación es validador de espacios de nombres si además informa violaciones de validez de espacios de nombres. ]
Para una definición y discusión más general de los IRI, consulte el [Borrador 5 de IRI] (trabajo en progreso).
Las referencias URI se limitan a un subconjunto de caracteres ASCII; las referencias IRI permiten la mayoría de los caracteres Unicode desde #xA0 en adelante. Los borradores anteriores del RFC de IRI (ej. [Borrador 3 IRI]) también permitían algunos de los caracteres ASCII no permitidos, pero el borrador actual ([Borrador 5 IRI]) no.
[Definición: Los caracteres adicionales permitidos en los IRI por el [Borrador 5 IRI] son: ]
los caracteres Unicode del plano 0 #xA0 - #xD7FF, #xF900-#xFDCF, #xFDF0-#xFFEF
los caracteres Unicode de los planos 1 al 14 #x10000-#x1FFFD ... #xD0000-#xDFFFD, #xE1000-#xEFFFD
[Definición: Una referencia IRI es una cadena que puede ser convertida en una referencia URI aplicando los siguientes pasos: ]
Convertir la parte del nombre del anfitrión, en caso de estar presente, utilizando la operación ToASCII detallada en la Sección 4.1 del [RFC3490] con los indicadores UseSTD3ASCIIRules y AllowUnassigned como TRUE (verdadero).
Libere todos los caracteres adicionales del siguiente modo:
Cada carácter adicional es convertido a UTF-8 [RFC3629] como uno o más bytes.
Los bytes resultantes son liberados con el mecanismo de escape URI (esto es, convertidos a %HH, donde HH es la notación hexadecimal del valor de byte).
El carácter original es reemplazado por la secuencia de caracteres resultante.
Nota:
El algoritmo que se encuentra en el [Borrador 5 URI] incluye un paso de normalización UCS, sin diferenciar cuáles cadenas son referencias IRI.
Esta versión incorpora las erratas a la versión 1.0 hasta el 6 de diciembre de 2002[Erratas a 1.0]. Hay dos cambios importantes adicionales:
Se brinda un mecanismo para eliminar la declaración de prefijos;
Los nombres de espacios de nombres son IRI, en lugar de URI.
Hay varios cambios de redacción, incluyendo una serie de cambios y agregados de terminología pensados para mejorar la coherencia. El apéndice no normativo "Estructura interna de los espacios de nombres XML" ha sido eliminado.