CURSO DE XLM PARTE 2

Agréganos a tus Favoritos

 

<< CURSO DE XLM PARTE 1


Extensible Markup Language (XML) 1.0
Segunda Parte...

3.3.3 Normalización de Atributos-Valor

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.

3.4 Secciones Condicionales

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.

Sección Condicionales
[61]  conditionalSect ::= includeSectignoreSect
[62]  includeSect ::= '<![' S? 'INCLUDE' S? '[' extSubsetDecl ']]>'
[63]  ignoreSect ::= '<![' S? 'IGNORE' S? '[' ignoreSectContents* ']]>'
[64]  ignoreSectContents ::= Ignore ('<![' ignoreSectContents ']]>' Ignore)*
[65]  Ignore ::= Char* - (Char* ('<![' | ']]>') Char*)

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?)>
]]>

 

4. Estructuras Físicas

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.

4.1 Referencias a Caracteres y Entidades

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.

Referencia a Entidad
[67]  Reference ::= EntityRefCharRef
[68]  EntityRef ::= '&' Name ';' [ RBF: Entidad Declarada ]
        [ RV: Entidad Declarada ]
        [ RBF: Entidad Analizada ]
        [ RBF: No Recursión ]
[69]  PEReference ::= '%' Name ';' [ RV: Entidad Declarada ]
        [ RBF: No Recursión ]
        [ RBF: En DTD ]

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> (&#x3C;) 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;

 

4.2 Declaraciones de Entidad

Las entidades son declaradas de este modo:

Declaración de Entidades
[70]  EntityDecl ::= GEDeclPEDecl
[71]  GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>'
[72]  PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>'
[73]  EntityDef ::= EntityValue | (ExternalID NDataDecl?)
[74]  PEDef ::= EntityValueExternalID

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.

4.2.1 Entidades Internas

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.">

4.2.2 Entidades Externas

Si la entidad no es interna, es una entidad externa, declarada como sigue:

Declaración de Entidad Externa
[75]  ExternalID ::= 'SYSTEM' S SystemLiteral
      | 'PUBLIC' S PubidLiteral S SystemLiteral
[76]  NDataDecl ::= S 'NDATA' S Name [ RV: Notación Declarada ]

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 >

4.3 Entidades Analizadas

4.3.1 Declaración de Texto

Las entidades analizadas externas pueden empezar, cada una de ellas, con una declaración de texto.

Declaración de Texto
[77]  TextDecl ::= '<?xml' VersionInfo? EncodingDecl S? '?>'

 

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.

4.3.2 Entidades Analizadas Bien-Formadas

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
[78]  extParsedEnt ::= TextDecl? content
[79]  extPE ::= TextDecl? extSubsetDecl

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.

4.3.3 Codificación de Caracteres en Entidades

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'?>

4.4 Tratamiento de Entidades y Referencias por el Procesador XML

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.
  Tipo Entidad
Parámetro Interna
General
Externa Analizada
General
No Analizada
Referencia
en Contenido
No reconocida Incluida Incluida si validada Prohibida
Referencia en
Valor de Atributo
No reconocida Incluida en literal Prohibida Prohibida
Aparece como
Valor de Atributo
No reconocida Prohibida Prohibida Notificar
Referencia
en EntityValue
Incluida en literal Obviada Obviada Prohibida
Referencia
en DTD
Incluida como PE Prohibida Prohibida Prohibida

4.4.1 No Reconocidas

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.

4.4.2 Incluidas

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&amp;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.

4.4.3 Incluidas Si Validadas

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.

4.4.4 Prohibidas

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.

4.4.5 Incluidas en Literal

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;>

4.4.6 Notificar

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