Especificación XML 1.0

eXtensible Markup Language

 

Estructuras Físicas

Un documento XML puede estar compuesto por muchas unidades de almacenamiento llamadas entidades. Todas ellas tienen un contenido y son identificadas por un nombre (excepto la identidad documento y el subconjunto DTD externo).

La idea básica es la reutilización de componentes. El autor del documento sólo necesita escribir el nombre de la entidad. El procesador XML se encarga de sustituir este nombre por el contenido real de la entidad.

Todos los documentos XML tienen una entidad llamada entidad documento (document entity), que sirve de punto de partida al procesador XML. La entidad documento puede contener el documento XML completo.

Las entidades pueden ser entidades analizables (parsed, p.e. un trozo de XML) o no analizables (unparsed, p.e. una imagen). El contenido de una entidad analizable recibe el nombre de texto de sustitución (replacement text) y es considerado como parte integral del documento.

Las entidades no analizables son recursos cuyos contenidos pueden ser texto o no. Si es texto, no debe ser XML. Cada entidad no analizable tiene una notación asociada (notation) identificada por un nombre. XML no impone ninguna restricción al contenido de las entidades no analizables.

Las entidades analizables son invocadas por su nombre, utilizando referencias a entidad. Las entidades no analizables son invocadas a través del nombre que aparece en el valor del atributo ENTITY o ENTITIES.

Las identidades generales (general entities) son entidades que se utilizan dentro del contenido del documento. Las entidades de parámetros son entidades con formato utilizadas dentro del DTD. Estos dos tipos son referenciados de forma diferente y son reconocidos en contextos diferentes. Además forman parte de espacios de nombres diferentes (es decir, que pueden tener el mismo nombre)

 

Referencias a caracteres y entidades

Una referencia a carácter apunta a una carácter específico en el conjunto de caracteres ISO/IEC 10646 (por ejemplo caracteres especiales).

[66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'
[ WFC: Legal Character ]

Una referencia a entidad apunta al contenido de una entidad con nombre. Las referencias a entidades con formato utilizan (&) y ( ; ) como delimitadores. Las referencias a entidades de parámetros utilizan (%) y (;) como delimitadores.

Requisitio para documento bien formado

Los caracteres referenciados deben cumplir los requisitos de la regla Char. Si la referencia comienza por "&#xN", N especifica el código hexadecimal del carácter en ISO/IEC 10646. Si comienza por "&#N" especifica dicho código en notación decimal.


Referencia de entidad

[67] Reference ::= EntityRef | CharRef

[68] EntityRef ::= '&' Name ';'         
[WFC: Entity Declared ] [VC: Entity Declared ]
[ WFC: Parsed Entity ] [WFC: No Recursion ]

[69] PEReference ::= '%' Name ';'
[ VC: Entity Declared ] [WFC: No Recursion ][ WFC: In DTD ]

En un documento sin DTD, uno con sólo un DTD interno que no contenga referencias a entidad-parámetro o un documento independiente (standalone=’yes’), el nombre dado en la referencia de entidad debe coincidir con una declaración de entidad.

No es necesario declarar las entidades: amp, lt, gt, apos, quot. Sin embargo, los documentos deberían declararlas.

La declaración de una entidad-parámetro debe ir delante de cualquier referencia a la misma.

En un documento con un subconjunto externo o entidades-parámetro externas con "standalone=’no’", el nombre dado en la referencia a la entidad debe coincidir con la declaración de entidad.

Una referencia a una entidad no debe contener el nombre de una entidad sin formato. Las entidades sin formato pueden ser referenciadas mediante el valor de un atributo de tipo ENTITY o ENTITIES.

Una entidad analizable no puede contener referencias a sí misma (ya sea directa o indirectamente) para evitar recursividad.

Las referencias a entidades-parámetros sólo deberían aparecer en el DTD.

Ejemplo de referencias a caracteres:

Type <key>less-than</key> (&#x3C;) to save options.
This document was prepared on &docdate; and is classified &security-level;.

Ejemplo de referencia a entidad de parámetros:

<!-- declare the parameter entity "ISOLat2"... -->
<!ENTITY % ISOLat2
       SYSTEM "http://www.xml.com/iso/isolat2-xml.entities" >
<!-- ... now reference it. -->
%ISOLat2;

 

Declaraciones de entidades

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

 
El nombre (Name) identifica la entidad en una referencia a dicha entidad (o en el valor del atributo ENTITY o ENTITIES en caso de entidades sin formato).

Si la misma entidad es declarada más de una vez, se toma como válida la primera. El procesador puede indicar, a petición del usuario, la aparición de duplicados.


Entidades internas

Si la definición de entidad es un EntityValue, la entidad definida recibe el nombre de entidad interna. Para estas entidades no hay un almacenamiento físico distinto y el contenido está en la propia declaración.

Las entidades internas son entidades analizables (parsed).

Ejemplo:

<!ENTITY Pub-Status "This is a pre-release of the specification.">

 

Entidades Externas

[75] ExternalID ::= 'SYSTEM' S SystemLiteral | 'PUBLIC' S PubidLiteral S SystemLiteral
[76] NDataDecl ::= S 'NDATA' S Name [VC: Notation Declared ]

Si NDataDecl está presente, se trata de una entidad general sin formato (unparsed) , si no, es una entidad con formato.

El nombre (Name) debe coincidir con el nombre declarado para una notación.

SystemLiteral recibe el nombre de Identificador del Sistema de la entidad. Es una dirección (URI) que puede ser utilizada para recoger la entidad. Sólo debe contener la situación de la entidad, sin identificador de fragmento como sucede en HTML por ejemplo:

(http://mi.casa.com//entidad.html#seccion1)

Las direcciones relativas lo son con respecto a la situación del recurso en el que la declaración tiene lugar (a menos que se especifique lo contrario en un DTD o una instrucción de procesamiento específicas).

Una URI puede ser relativa a la entidad documento, a la entidad que contiene el subconjunto DTD externo o a cualquier otra entidad-parámetro externa.

Los procesadores XML deberían manejar los caracteres no ASCII encontrados en una URI como UTF-8 (uno o más bytes) y utilizando secuencias de escape con el mecanismo apropiado (por ejemplo, expresando cada byte en formato %HH -notación hexadecimal-)

Un identificador externo puede incluir, además del identificador de sistema (URI), un identificador público, que será utilizado por el procesador XML para intentar generar una dirección alternativa. Si el procesador no es capaz de lograrlo, debe utilizar la URI especificada en el literal de sistema. La cadena de caracteres en el identificador público debe ser normalizada para eliminar los espacios iniciales y finales y los espacios duplicados.

Ejemplo de declaraciones externas:

<!ENTITY open-hatch
  SYSTEM  "http://www.textuality.com/boilerplate/OpenHatch.xml">

<!ENTITY open-hatch
  PUBLIC "-//Textuality//TEXT Standard open-hatch boilerplate//EN"
  "http://www.textuality.com/boilerplate/OpenHatch.xml">

<!ENTITY hatch-pic
  SYSTEM "../grafix/OpenHatch.gif" NDATA gif >

 

Entidades analizables

Las entidades analizables externas pueden comenzar con una 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 con formato. Ninguna declaración de texto puede aparecer en otra posición que no sea el comienzo de una entidad con formato externa.

La entidad documento está ‘bien formada’ si coincide con la regla document. La entidad general con formato externa está ‘bien formada’ si coincide con el nombre de la regla extParsedEnt. La entidad-parámetro externa está ‘bien formada’ si coincide con la producción denominada extPE.

[78] extParsedEnt ::= TextDecl? content
[79] extPE ::= TextDecl? extSubsetDecl

Una entidad general interna con formato está ‘bien formada’ si su texto de sustitución coincide con la regla content. Todas las entidades de parámetros están bien formadas por definición.

Las entidades ‘bien formadas’ tienen estructuras físicas y lógicas correctamente anidadas.

 

Codificación de caracteres en entidades

Cada entidad externa con formato en un documento XML puede utilizar una codificación diferente para sus caracteres. Los procesadores XML deben ser capaces de leer entidades codificadas tanto en UTF-8 como en UTF-16.

Las entidades codificadas en UTF-16 deben comenzar con la marca de orden de byte descrita por el Anexo E de ISO/IEC 10646 y el Apéndice B de Unicode (carácter #xFEFF). Este carácter inicial es una indicación de codificación, no forma parte de ninguna marca del documento XML. El procesador XML debe utilizar este carácter para diferenciar entre UTF-8 y UTF-16.

Aunque no están obligados, los procesadores también deberían ser capaces de leer entidades con otras codificaciones. En este caso, estas entidades deben comenzar con una declaración de texto que contenga una declaración de codificación:

[80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' | "'" EncName "'" )
[81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')*

En la entidad documento, la declaración de codificación es parte de la declaración XML. El valor de EncName es el nombre de la codificación utilizada.

Valores utilizados en la declaración de codificación:

Unicode/ISO/IEC 10646:
"UTF-8", "UTF-16", "ISO-10646-UCS-2", "ISO-10646-UCS-4"

ISO 8859:
"ISO-8859-1", "ISO-8859-2", ..., "ISO-8859-9"

JIS X-0208-1997:
"ISO-2022-JP", "Shift_JIS", "EUC-JP"

Para otras codificaciones, se deberían utilizar los nombres oficiales (registrados).

Los procesadores XML no deberían distinguir entre mayúsculas y minúsculas a la hora de procesar los nombres de los conjuntos de caracteres.

Si no hay información proporcionada por un protocolo de transporte externo (p.e. HTTP o MIME), aparecerá un error si:

  • Una entidad con una declaración de codificación presenta la información al procesador XML en una codificación distinta de la designada en la declaración
  • Una declaración de codificación aparece en cualquier otro sitio que no sea al principio de una entidad externa.
  • Una entidad utiliza un código distinto de UTF-8 y no lo ha declarado previamente con la marca de orden de byte o con una declaración de codificación.
  • Aparecerá un error irrecuperable (fatal error) si el procesador intenta leer una entidad con una codificación que no reconoce.

Ejemplos de declaración de codificación:

<?xml encoding='UTF-8'?>
<?xml encoding='EUC-JP'?>

 

Tratamiento de entidades y referencias

La tabla siguiente recoge las características necesarias de un procesador XML.

  Tipo de Entidad Carácter
Parámetro Interna General Externa con Formato Sin Formato
Referencia en contenido no reconocido Incluido Incluido si validación Prohibido Incluido
Ref. en valor de atributo no reconocido Incluido en el literal Prohibido Prohibido Incluido
Valor de atributo no reconocido Prohibido Prohibido Aviso no reconocido
Referencia en EntityValue Incluido en el literal Ignorado Ignorado Prohibido Incluido
Referencia en DTD Incluido como PE* Prohibido Prohibido Prohibido Prohibido


Referencia en el contenido
Referencia en cualquier posición entre las marcas de comienzo y final de un elemento.

Referencia en valor de atributo
Referencia dentro del valor de un atributo en una marca de comienzo o valor por defecto en una declaración de atributos.

Valor de atributo
Como un nombre, no una referencia, que aparece como valor de un atributo declarado como ENTITY, o como cada uno de los elementos de la lista en un atributo declarado como ENTITIES.

Referencia en un valor de entidad (Entity Value)
Referencia dentro de un parámetro o dentro del valor literal de entidad de una entidad interna en la declaración de entidad.

Reference in DTD
Referencia dentro del subconjunto DTD interno o externo, pero fuera de EntityValue o AttValue.


Fuera del DTD, el carácter % no tiene significado especial. De la misma forma, los nombres de entidades sin formato no son reconocidos, excepto cuando aparecen en el valor de un atributo declarado.

Una entidad es incluida cuando su texto de sustitución es recogido del origen y procesado, sustituyendo a la referencia asociada. El texto de sustitución puede contener tanto datos como marcas (excepto para entidades-parámetro). Las marcas deben ser reconocidas como tal, a menos que se utilicen secuencias de escape.

Cuando un procesador XML reconoce una referencia a una entidad con formato, debe incluir su texto de sustitución para validar el documento. Si se trata de una entidad externa, y el procesador no está validando el documento, puede (aunque no es necesario) incluir el texto de sustitución de la entidad.

Si un procesador (no de validación) no incluye el texto de sustitución, debe informar a la aplicación que reconoció (aunque no leyó) la entidad.

Por ejemplo, los navegadores no necesitan leer una entidad externa hasta que el usuario la demande.

Los siguientes casos se consideran como errores irrecuperables:

  • La aparición de una referencia a una entidad sin formato
  • La aparición de cualquier referencia a carácter o a entidad general dentro del DTD, si no está en EntityValue o AttValue
  • Una referencia a una entidad externa en un valor de atributo.

Cuando una referencia a una entidad aparece en un valor de atributo, o una referencia a una entidad de parámetros aparece en el valor literal de una entidad, su texto de sustitución es procesado en lugar de la referencia (los caracteres comilla simple o doble dentro del texto de sustitución son tratados como caracteres normales y no hacen que finalice el literal):

Bien formado:

<!ENTITY % YN '"Yes"' >
<!ENTITY WhatHeSaid "He said &YN;" >

Mal formado:

<!ENTITY EndAttr "27'" >
<element attribute='a-&EndAttr;>


Cuando el nombre de una entidad sin formato aparece como un elemento en el valor de un atributo ENTITY o ENTITIES, el procesador (validación) debe informar a la aplicación de los identificadores ‘public’ y ‘system’ asociados a la entidad y su notación.

Cuando aparece una referencia a una entidad general en EntityValue en una declaración de entidad, es ignorada por el procesador y permanece tal cual.

Como sucede con las entidades externas con formato, las entidades de parámetros sólo necesitan ser incluidas para validar el documento. Cuando una referencia a una entidad-parámetro es localizada en el DTD, a su texto de sustitución se le añaden un carácter espacio inicial y uno final (#x20).


Construcción del texto de sustitución para una entidad interna

Se pueden distinguir dos formas de valor de entidad:

  • El valor literal de la entidad es la cadena (entre comillas) presente en la declaración de entidad (EntityValue).
  • Texto de sustitución, es el contenido de la entidad.

El valor literal puede contener referencias a caracteres, entidades de parámetros y entidades generales. Tales referencias deben estar totalmente contenidas dentro del valor literal de la entidad.

El texto de sustitución que es incluido debe contener el texto de sustitución de cualquier entidad-parámetro referenciada, así como los caracteres a los que se hace referencia. Sin embargo, las referencias a entidades generales deben quedar como están, no deben ser expandidas:

<!ENTITY % pub "&#xc9;ditions Gallimard" >
<!ENTITY rights "All rights reserved" >
<!ENTITY book "La Peste: Albert Camus,
     &#xA9; 1947 %pub;. &rights;" >

El texto de sustitución para la entidad ‘book’ es:

La Peste: Albert Camus, © 1947 Éditions Gallimard. &rights;

La entidad general "&rights;" debería ser expandida si apareciese la referencia "&book;" en el contenido del documento o en un valor de atributo.


Entidades predefinidas

Las referencias a entidades y caracteres pueden ser utilizadas como secuencias de escape. El conjunto de entidades generales (amp, lt, gt, apos, quot) son especificadas para este propósito. También pueden ser utilizadas referencias numéricas, que serán tratadas como caracteres de datos, por ejemplo, la secuencia de escape de < puede ser ‘lt’ o ‘<’.

Todos los procesadores XML deben reconocer estas entidades tanto si son declaradas como si no. Los documentos XML válidos deberían declararlas (como cualquier otra) antes de usarlas. Deben ser declaradas como entidades internas cuyo texto de sustitución sea el carácter o la referencia al carácter.

<!ENTITY lt "&#60;">
<!ENTITY gt ">">
<!ENTITY amp "&#38;">
<!ENTITY apos "'">
<!ENTITY quot """>

Los caracteres < y & en las declaraciones de las entidades ‘lt’ y ‘amp’ tienen doble secuencia de escape, de forma que el texto de sustitución esté bien formado.


Declaraciones de notación

Las notaciones se utilizan para identificar a través de un nombre las entidades no analizables, para identificar el formato de elementos con un atributo de notación o a la aplicación a la que es dirigida una instrucción de procesamiento.

Las declaraciones de notación proporcionan un nombre a la notación cuando son usadas en declaraciones de entidades y de lista de atributos, y en especificaciones de atributo. También proporcionan un identificador externo para la notación que permite al procesador XML (o a su aplicación) localizar una aplicación auxiliar que sea capaz de procesar los datos expresados en dicha notación.

[82] NotationDecl ::= '<!NOTATION' S Name S (ExternalID | PublicID) S? '>'
[83] PublicID ::= 'PUBLIC' S PubidLiteral

Los procesadores XML deben proporcionar aplicaciones con el nombre y el identificador externo de cualquier notación declarada y referenciada en un valor de atributo, definición de atributo o declaración de entidad.

Además, deben averiguar el identificador externo a partir del identificador de sistema (system identifier), del nombre del fichero, o a partir de cualquier otra información que permita a la aplicación realizar una llamada al procesador para recibir datos en la notación descrita.


Entidad Documento

La entidad documento es el origen (raíz) de la estructura de entidades y sirve de punto de partida al procesador XML. La entidad documento no tiene nombre y puede aparecer en la entrada del procesador sin ningún tipo de identificación.

 

Enlaces patrocinados:
Viajar por Extremadura - Comarcas de Extremadura - Casas rurales, hoteles y alojamiento en la provincia de Badajoz - Extremadura - Casas rurales, apartamentos, hoteles y alojamiento en la provincia de Cáceres - Extremadura

 

Felipe Fernández Perera : Google+