|
Segunda Parte...
Antes
de que el valor de un atributo se pase a la aplicación o se
compruebe su validez, el procesador XML debe normalizarlo como se
indica a continuación:
-
una
referencia a carácter es procesada mediante la adición del
carácter referenciado al valor del atributo
-
una
referencia a entidad es procesada por procesamiento recursivo
del texto de reemplazo de la entidad
-
un
carácter "espacio en blanco" (#x20, #xD, #xA, #x9)
es procesado mediante la adición del valor normalizado #x20,
excepto en la secuencia "#xD#xA" que sólo se añade
un único #x20, que es parte de una entidad externa analizada
o el valor literal de entidad de una entidad interna analizada
-
el
resto de caracteres son procesados mediante la adición del
valor normalizado
Si
el valor declarado no es de tipo CDATA, el procesador XML debe
procesar el valor de atributo normalizado, mediante el descartado
de cualquier carácter espacio (#x20) por delante o por detrás, y
mediante el reemplazo de secuencias de caracteres espacio (#x20)
por un único carácter espacio (#x20).
Todos
los atributos para los que no se ha leído la declaración deben
ser tratado por un analizador no validador como se declara en
CDATA.
Las
secciones condicionales son porciones del
subconjunto
externo de la declaración de tipo de documento que están
incluidas en, o excluidas de, la estructura lógica de la DTD
basada en la palabra clave que las gobierna.
Como
ocurre con los subconjuntos de la DTD internos y externos, una
sección condicional puede contener una o más declaraciones
completas, comentarios, instrucciones de procesamiento o secciones
condicionales anidadas, entremezcladas con espacios en blanco.
Si
la palabra clave de la sección condicional es INCLUDE, los
contenidos de la sección condicional son parte de la DTD. Si la
palabra clave es por el contrario IGNORE, los contenidos de la
sección condicional no son parte lógica de la DTD. Hay que
subrayar que para poder realizar un análisis con confianza,
incluso los contenidos de la secciones condicionales ignoradas
debe ser leído para poder detectar secciones condicionales
anidadas y asegurar que el final de la sección ignorada más
extrema se detecta de manera adecuada. Si una sección condicional
con la palabra clave INCLUDE aparece dentro de una sección
condicional más grande con la palabra clave IGNORE, ambas, la
más exterior y la interior son ignoradas.
Si
la palabra clave de la sección condicional es una referencia a
entidad parámetro, la entidad parámetro debe ser reemplazada por
su contenido antes de que el procesador decida si incluye o ignora
la sección condicional.
Un
ejemplo:
<!ENTITY % borrador 'INCLUDE' >
<!ENTITY % final 'IGNORE' >
<![%borrador;[
<!ELEMENT libro (comentarios*, titulo, cuerpo, suplementos?)>
]]>
<![%final;[
<!ELEMENT libro (titulo, cuerpo, suplementos?)>
]]>
|
Un
documento XML puede consistir de una o más unidades de
almacenamiento. Estas se denominan entidades, y todas ellas poseen
contenidos y todas son (excepto la entidad documento, ver más
abajo, y el
subconjunto
externo de la DTD) identificadas por su nombre. Cada documento
XML posee una entidad denominada
entidad
documento, la cual sirve de punto de comienzo al
procesador
XML y que puede contener a todo el documento.
Las
entidades pueden ser analizadas o no analizadas. Los
contenidos de una entidad analizada son referenciados como su
texto
de reemplazo. Este
texto
es considerado parte integral del documento.
Una
entidad no analizada es un recurso cuyo contenido puede o no ser
texto,
y si lo es, puede que no sea XML. Cada entidad no analizada tiene
notación
asociada, identificada por su nombre. A parte de la necesidad de
que los procesadores XML hagan accesibles los identificadores de
la entidad y la notación a la aplicación, XML no impone ningún
otro tipo de restricciones a los contenidos de las entidades no
analizadas.
Las
entidades analizadas son invocadas por su nombre mediante la
utilización de referencias a entidades, las no analizadas lo
hacen por su nombre, dado en el valor de los atributos ENTITY o
ENTITIES.
Las
Entidades Generales son entidades que se utilizan dentro del
contenido del documento. En esta especificación, las entidades
generales son referenciadas, a veces, simplemente con el término
entidad, siempre y cuando no se produzcan ambigüedades. Las
entidades parámetro son entidades analizadas que se utilizan en
las DTDs. Estos dos tipos de entidades utilizan diferentes formas
y referencias y son reconocidas en contextos diferentes, es más,
ocupan diferentes espacios de nombres. Pueden existir una entidad
parámetro y una entidad general con el mismo nombre, dado que son
entidades diferentes.
Una
referencia a carácter hace referencia a un carácter especifico
del conjunto de caracteres de la norma ISO/IEC 10646. Un ejemplo
puede ser un carácter no accesible directamente a través de los
dispositivos de introducción de datos.
|
Referencia
a Carácter |
|
[66] |
CharRef |
::= |
'&#'
[0-9]+ ';' |
| |
|
|
| '&#x'
[0-9a-fA-F]+ ';' |
[ |
RBF:
Carácter
Legal ] |
|
Restricción
de Buena-Formación: Carácter Legal
Los caracteres referenciados mediante la utilización de
referencias a caracteres deben cumplir los requisitos de la regla
de producción
Char.
Si
la referencia a carácter comienza por "&#x", los
dígitos y las letras que le siguen hasta la aparición de ;
proporcionan una representación hexadecimal del punto código del
carácter en la norma ISO/IEC 10646. Si comienza por
"&#", los dígitos que aparecen hasta la aparición
de ; indican una representación decimal del punto código de
carácter.
Una
referencia a entidad referencia al contenido de una entidad con
nombre. Las referencias a entidades
generales analizadas utilizan el carácter ampersand (&) y, el
punto y coma (;) como delimitadores. Las
referencias a entidades parámetro utilizan el signo de porcentaje
(%) y el punto y coma (;) como delimitadores.
Restricción
de Buena-Formación: Entidad Declarada
En los documentos sin ningún DTD, un documento con sólo un
subconjunto de DTD interno que no contiene referencias a entidades
parámetro, o un documento con la cláusula "standalone='yes'",
el símbolo
Name dado
en la referencia a entidad debe
ser
igual al dado en una
declaración
de entidad/A>, excepto en los documentos bien-formados que
utilicen las entidades predeclaradas: amp, lt, gt, apos, quot. La
declaración de las entidades parámetro deben preceder a
cualquier referencia a ellas. De igual manera, las declaración de
las entidades generales debe preceder a cualquier referencia a
ellas que aparezca en la declaración de los valores por defecto
de una lista de atributos. Si las entidades se declaran en el
subconjunto externo o en las entidades parámetro externas, los
procesadores no validadores
no
están obligados a leer y procesar sus declaraciones. Para
esos documentos, la regla que dice que una entidad debe ser
declarada es una restricción de buena-formación sólo si se da
lo siguiente:
standalone='yes'.
Restricción
de Validez: Entidad Declarada
En los documentos con un subconjunto externo o entidades
parámetro externas con la expresión "standalone='no'",
el
Name dado en la
referencia a entidad debe
ser
igual al dado en una
declaración
de entidad. Por interoperatividad, los documentos válidos
deberían declarar las entidades amp, lt, gt, apos, quot, de la
manera especificada en la sección "4.6 Entidades
Predefinidas". La declaración de una entidad parámetro
debe preceder a cualquier referencia a ella. De manera similar, la
declaración de una entidad general debe preceder a cualquier
referencia a ella que aparezca en la declaración de los valores
por defecto de una lista de atributos.
Restricción
de Buena-Formación: Entidad Analizada
Una referencia a entidad no debe contener el nombre de una
entidad
no analizada. Las entidades no analizadas sólo pueden ser
referenciadas en
valores
de atributos declarados para ser del tipo ENTITY o ENTITIES.
Restricción
de Buena-Formación: No Recursión
Una entidad analizada no debe contener una referencia recursiva a
sí misma, ni directa ni indirectamente.
Buena-Formación
Restricción: En DTD
Las referencias a entidades parámetro sólo pueden aparecer en la
DTD.
Ejemplos
de referencias a caracteres y entidades:
Pulse <tecla>menor</tecla> (<) para guardar las opciones.
Este documento fue creado el &fechadoc; y
su clasificación &nivel-seguridad;. |
Ejemplos
de referencias a entidades parámetro:
<!-- declarar la entidad parámetro "ISOLat2"... -->
<!ENTITY % ISOLat2
SYSTEM "http://www.xml.com/iso/isolat2-xml.entities" >
<!-- ... ahora hacerle referencia. -->
%ISOLat2; |
Las
entidades son declaradas de este modo:
El
símbolo
Name
identifica la entidad en una
referencia
a entidad o, en el caso de una entidad no analizada, en el
valor de los atributos ENTITY o ENTITIES. Si se declara la misma
entidad más de una vez, se le vincula la primera declaración
encontrada. Como opción de usuario, los procesadores XML pueden
indicar si las entidades pueden ser declaradas múltiples veces.
Si
la definición de entidad es un
EntityValue,
la entidad definida se denomina entidad interna. No existe ningún
objeto físico de almacenamiento separado, y el contenido de la
entidad se da en la declaración. Algunos procesados de entidades
y referencias a caracteres en el
valor
de la entidad literal pueden ser requeridos para producir el
texto
de reemplazo correcto: véase "4.5 Construcción
de Texto de Reemplazo de Entidad Interna".
Una
entidad interna es una
entidad
analizada.
Un
ejemplo de una declaración de entidad interna:
<!ENTITY Estado-Pub "Esta es una pre-edición de la
Especificación."> |
Si
la entidad no es interna, es una entidad externa, declarada como
sigue:
|
Declaración
de Entidad Externa |
|
|
Si
NDataDecl está
presente, ésta es una
entidad
no analizada general, sino, es una entidad analizada.
Restricción
de Validez: Notación Declarada
El
Name debe ser igual
al nombre declarado de una
notación.
A
SystemLiteral
se le denomina identificador de sistema de la entidad. Es un URI
que puede ser utilizado para obtener la entidad. El símbolo de
'sostenido' (#) y el identificador de fragmento frecuentemente
utilizados con URIs no son, formalmente, parte del propio URI. Los
procesadores XML podrían señalar un error si es dado un
identificador de fragmento como parte de un identificador de
sistema. Si no se proporciona otra información fuera del ámbito
de esta especificación (e.g. un tipo especial de elemento XML
definido por una DTD particular, o una instrucción de
procesamiento definida por la especificación de una aplicación
particular), los URIs relativos son relativos a la localización
del recurso dentro del que ocurre la declaración de entidad. Un
URI podría ser relativo a la
entidad
documento, a la entidad que contenga el
subconjunto
de DTD externa, o a alguna otra
entidad
parámetro externa.
Los
procesadores XML deberían manejar los caracteres no ASCII en un
URI mediante la representación del carácter en UTF-8 como uno o
más de bytes, y después 'escapar' estos bytes con el 'mecanismo
de escapado' de los URIs (e.g., convirtiendo cada byte a %HH,
donde HH es la notación hexadecimal del valor del byte).
Adicionalmente
al identificador de sistema, un identificador externo puede
incluir un identificador público. Los procesadores XML que traten
de obtener el contenido de la entidad pueden utilizar el
identificador público para intentar generar un URI alternativo.
Si el procesador no es capaz de hacer esto, debe utilizar el URI
especificado en el literal de sistema. Antes de aceptar una
igualdad, todas las cadenas de espacios en blanco del
identificador público deben ser normalizadas a caracteres espacio
únicos (#x20), y deben eliminarse los espacios en blanco del
comienzo y del final.
Un
ejemplo de declaración de entidad externa:
<!ENTITY abrir-trampa
SYSTEM "http://www.textuality.com/boilerplate/AbrirTrampa.xml">
<!ENTITY abrir-trampa
PUBLIC "-//Textuality//TEXT Standard abrir-trampa boilerplate//EN"
"http://www.textuality.com/boilerplate/AbrirTrampa.xml">
<!ENTITY img-trampa
SYSTEM "../grafix/AbrirTrampa.gif"
NDATA gif > |
Las
entidades analizadas externas pueden empezar, cada una de ellas,
con una declaración de texto.
La
declaración de texto debe ser proporcionada literalmente, no por
referencia a una entidad analizada. Ninguna declaración de texto
puede aparecer en cualquier posición que no sea el comienzo de
una entidad analizada externa.
La
entidad documento está bien-formada si cumple la producción
denominada
document.
Una entidad analizada general externa está bien-formada si cumple
la producción denominada
extParsedEnt.
Una entidad parámetro externa está bien-formada si cumple la
producción denominada
extPE.
|
Entidad
Analizada Externa Bien-Formada |
|
|
Una
entidad analizada general interna está bien-formada si su texto
de reemplazo cumple la producción denominada
content.
Todas las entidades parámetro internas están bien-formadas por
definición.
Una
consecuencia de la buena-formación en entidades es que las
estructuras lógica y física en los documentos XML están
anidadas apropiadamente. Ninguna
etiqueta
de comienzo,
etiqueta
de fin,
etiqueta de
elemento vacío,
elemento,
comentario,
instrucción
de procesamiento,
referencia
a carácter o
referencia
a entidad puede comenzar en una entidad y terminar en otra.
Cada
entidad analizada externa en un documento XML puede utilizar una
codificación diferente para sus caracteres. Todos los
procesadores XML deben ser capaces de leer entidades tanto UTF-8
como en UTF-16.
Las
entidades codificadas en UTF-16 deben comenzar con la 'Byte Order
Mark' descrita por la norma ISO/IEC 10646 Anexo E y Apéndice B de
Unicode (el carácter 'ZERO WIDTH NO-BREAK SPACE', #xFEFF). Esta
es una señal de codificación, no parte de la marcación o de los
datos carácter del documento XML. Los procesadores XML deben ser
capaces de utilizar este carácter para diferenciar entre
documentos codificados en UTF-8 o en UTF-16.
Aunque
sólo se requiere que los procesadores XML lean entidades en las
codificaciones UTF-8 y UTF-16, se reconoce que se utilizan otras
codificaciones en el mundo, y puede ser deseable que un procesador
XML pueda leer entidades que las utilicen. Las entidades
analizadas que se almacenan en una codificación que no sea UTF-8
o UTF-16 deben comenzar con una
declaración
de texto que contenga una declaración de codificación:
|
Declaración
de Codificación |
|
[80] |
EncodingDecl |
::= |
S
'encoding'
Eq
('"'
EncName
'"' | "'"
EncName
"'" ) |
|
[81] |
EncName |
::= |
[A-Za-z]
([A-Za-z0-9._] | '-')* |
/* |
El
nombre de la codificación sólo contiene
caracteres latinos */ |
|
en
la
entidad documento,
la declaración de codificación es parte de la
declaración
XML. La regla
EncName
es el nombre de la codificación utilizada.
En
las declaraciones de codificación, los valores "UTF-8",
"UTF-16", "ISO-10646-UCS-2" y
"ISO-10646-UCS-4" deben ser utilizados para las
diferentes codificaciones y transformaciones de Unicode / ISO/IEC
10646, los valores "ISO-8859-1", "ISO-8859-2",
... "ISO-8859-9" deben ser utilizados para las partes de
la ISO 8859, y los valores "ISO-2022-JP",
"Shift_JIS" y "EUC-JP" deben ser utilizados
para las diferentes formas de codificación de JIS X-0208-1997.
Los procesadores XML deberían reconocer otras codificaciones, se
recomienda que sean las codificaciones de caracteres registradas
(como charsets) por la Internet Assigned Numbers Authority
[IANA],
otras codificaciones sólo serán referenciadas mediante la
utilización de sus nombres registrados. Estos nombres registrados
están definidos para no ser sensibles al tipo, por lo que los
procesadores que quieran contemplarlos deberán tratarlos de ese
modo.
En
la ausencia de información proporcionada por un protocolo de
transporte externo (e.g. HTTP o MIME), es un
error
que una entidad incluya una declaración de codificación para ser
presentada al procesador XML en una codificación diferente a la
nombrada en la declaración, que una declaración de codificación
aparezca en un lugar que no sea el comienzo de una entidad
externa, o que una entidad que no comience una 'Byte Order Mark' o
una declaración de codificación utilice una codificación que no
sea UTF-8. Dado que ASCII es un subconjunto de UTF-8, no es
estrictamente necesaria una declaración de codificación para las
entidades ordinarias ASCII.
Se
produce un
error fatal
si un procesador XML encuentra una entidad con una codificación
que es incapaz de procesar.
Ejemplos
de declaraciones de codificación:
<?xml encoding='UTF-8'?>
<?xml encoding='EUC-JP'?> |
La
tabla de abajo resume el contexto en el que pueden aparecer las
referencias a caracteres, las referencias a entidades y las
invocaciones de entidades no analizadas y el comportamiento
requerido de los
procesadores
XML en cada caso. Las etiquetas de la columna de la izquierda
describen el contexto de reconocimiento:
-
Referencia
en Contenido
-
como
una referencia en cualquier lugar después de la
etiqueta
de comienzo y antes de la
etiqueta
de fin de un elemento, corresponde al no-terminal
content.
-
Referencia
en Valor de Atributo
-
como
una referencia dentro del valor de un atributo en una
etiqueta
de comienzo, o un valor por defecto en una
declaración
de atributo; corresponde al no-terminal
AttValue.
-
Aparece
como Valor de Atributo
-
como
un
Name, no una
referencia, apareciendo tanto como el valor de un atributo que
haya sido declarado con tipo ENTITY, o como uno de los
'tokens' separados por espacios en el valor de un atributo que
ha sido declarado con tipo ENTITIES.
-
Referencia
en Valor de Entidad
-
como
una referencia dentro del
valor
literal de una entidad parámetro o una entidad interna en
la declaración de la entidad; corresponde al no-terminal
EntityValue.
-
Referencia
en DTD
-
como
una referencia dentro de los subconjuntos interno o externo de
la
DTD, pero
fuera de
EntityValue
o de
AttValue.
Fuera
de la DTD, el carácter % no tiene un significado especial; de
este modo, lo que sería una referencia a una entidad parámetro
en una DTD no es reconocido como marcación en el
contenido.
De igual manera, los nombres de las entidades no analizadas no son
reconocidos excepto cuando aparecen en el valor de un atributo
declarado apropiadamente.
Una
entidad es incluida cuando su
texto
de reemplazo es obtenido y procesado, en lugar de la propia
referencia, como si fuese parte del documento en el lugar donde
fue reconocida la referencia. El texto de reemplazo puede contener
datos carácter y
marcaciones
(excepto para entidades parámetro), que deben ser reconocidos de
la forma habitual, a no ser que el texto de reemplazo de las
entidades utilizado para 'escapar' delimitadores de marcación
(las entidades amp, lt, gt, apos, quot) siempre se tratan como
datos. (La cadena "AT&T;" se expande como
"AT&T;" y el 'ampersand' restante no es reconocido
como un delimitador de referencia-entidad). Una referencia a
carácter es incluida cuando el carácter indicado es procesado en
lugar de la referencia propiamente dicha.
Cuando
un procesador XML reconoce una referencia a una entidad analizada,
en vez de
validar el
documento, el procesador debe
incluir
su texto de reemplazo. Si la entidad es externa y el procesador no
intenta validar el documento XML, el procesador
puede,
pero no necesita, incluir el texto de reemplazo de la entidad. Si
un analizador no validador no incluye el texto de reemplazo, debe
informar a la aplicación que reconoció, pero que no leyó, la
entidad.
Esta
regla se basa en el reconocimiento que la inclusión automática
proporcionada por SGML y el mecanismo de entidad XML,
principalmente diseñada para soportar la modularidad en la
creación. No es necesariamente apropiada para otras aplicaciones,
en particular para visualización de documentos. Los
visualizadores, por ejemplo, cuando encuentran una referencia a
entidad externa analizada, pueden elegir entre proporcionar una
indicación visual de la presencia de la entidad y obtenerla para
su visualización bajo demanda.
Los
siguientes están prohibidos y constituyen errores
fatales:
-
la
apariencia de una referencia a una
entidad
no analizada.
-
la
apariencia de cualquier carácter o referencia a entidad
general en la DTD excepto dentro de un
EntityValue
o de un
AttValue.
-
una
referencia a una entidad externa en un valor de atributo.
Cuando
una
referencia a entidad
aparece en un valor de atributo, o una referencia a entidad
parámetro aparece en un valor de entidad literal, su
texto
de reemplazo es procesado en lugar de la propia referencia, en
la que parte documento donde es reconocida la referencia, excepto
el carácter comilla simple o doble en el texto de reemplazo que
siempre es tratado como un dato carácter normal y no terminará
el literal. Por ejemplo, esto está bien-formado:
<!ENTITY % SN '"Sí"' >
<!ENTITY LoQueDijo "El dijo &SN;" > |
mientras
que esto no lo está:
<!ENTITY FinAtrib "27'" >
<elemento atributo='a-&FinAtrib;> |
Cuando
el nombre de una
entidad
no analizada aparece como un 'token' en el valor de un
atributo de los tipos declarados ENTITY o ENTITIES, un procesador
validador debe informar a la aplicación sobre los identificadores
de
sistema y
públicos
(si hubiese alguno) para ambas entidades y su
|