Prólogo y declaración de tipos de documento
eLos documentos XML deberían comenzar con una declaración XML que especifique la versión XML utilizada.
Prólogo y declaración de tipos de documento
Los visualizadores deberían indicar con una señal de error la apertura de un documento cuya versión no pueden procesar.
Ejemplo de un documento bien formado (aunque no válido)
<?xml version="1.0"?>
<titulo>Este documento no es válido</titulo>
No es válido porque el elemento raíz <titulo> </titulo> no ha sido declarado.
XML proporciona un mecanismo (la declaración de tipos, DTD) para definir condiciones o restricciones sobre la estructura lógica y permitir el uso de unidades de almacenamiento predefinidas.
Un documento XML es válido si tiene una declaración de tipos asociada y el propio documento cumple con las reglas de esa declaración.
La declaración de tipos debe aparecer antes que el primer elemento del documento.
[22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?
[23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
[24] VersionInfo ::= S 'version' Eq (' VersionNum ' | " VersionNum ")
[25] Eq ::= S? '=' S?
[26] VersionNum ::= ([a-zA-Z0-9_.:] | '-')+
[27] Misc ::= Comment | PI | S
La declaración de tipos contiene o hace referencia a declaraciones de marcas que proporcionan una gramática para esa clase de documentos. Esta gramática se conoce como Document Type Definition o DTD.
Una declaración de marca es una declaración de tipo de elemento, una declaración de lista de atributos, una declaración de entidad o una declaración de notación. Estas declaraciones pueden estar contenidas, en todo o en parte, dentro de entidades de parámetros.
DTD
[28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S?
('[' (markupdecl | PEReference | S)* ']' S?)? '>'
[VC: Root Element Type ]
[29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment
[VC: Proper Declaration/PE Nesting ] [WFC: PEs in Internal Subset ]
Las declaraciones de marcas (markup) pueden se hechas en su totalidad o en parte a través del texto de sustitución de las entidades de parámetros.
Ejemplo de un documento XML con DTD interno:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!ELEMENT a (#PCDATA)>
<!ELEMENT de (#PCDATA)>
<!ELEMENT titulo (#PCDATA)>
<!ELEMENT contenido (#PCDATA)>
]>
<circular>
<a>Epsilon Eridani</a>
<de>Felipe</de>
<titulo>Especificacion XML</titulo>
<contenido>Ya esta casi terminada</contenido>
</circular>
Condición de validez: Elemento Raíz
Validity Constraint: Root Element Type
El nombre en la declaración de tipos del documento debe coincidir con el tipo de elemento del elemento raíz.
En el ejemplo anterior (DOCTYPE circular), <circular> es el elemento raíz del documento
Condición de validez: Declaración correcta y anidado
Validity Constraint: Proper Declaration / PE Nesting
El texto de sustitución de las entidades de parámetros debe ser anidado adecuadamente dentro de las declaraciones.
Esto quiere decir que si el primer carácter o el último de una declaración de marca (markupdecl) está contenido en el texto de sustitución para una referencia de una entidad de parámetros, ambos deben estar contenidos en el mismo texto de sustitución.
Condición de documento bien formado: Entidades de parámetros internas
Well-Formedness Constraint: PEs in Internal Subset
En la parte interna del DTD, las referencias a entidades de parámetros pueden aparecer sólo donde lo puedan hacer las marcas de declaración (no dentro de declaraciones de marcas)
La parte externa del DTD y cualquier entidad de parámetros externa referenciada debe estar formada por una serie (secuencia) de declaraciones completas de marcadores
Como sucede con el subconjunto interno del DTD, la parte externa y cualquier entidad de parámetros externa referenciada en el DTD debe estar formada por una secuencia de declaraciones de marca (completas) de los tipos permitidos.
Sin embargo, en el subconjunto externo o en las entidades de parámetros externas pueden aparecer secciones condicionales que pueden ser ignoradas o incluidas por el procesador XML dependiendo de las circunstancias.
[30] extSubset ::= TextDecl? extSubsetDecl
[31] extSubsetDecl ::= ( markupdecl | conditionalSect | PEReference | S )*
El subconjunto externo y las entidades de parámetros externas también difieren del subconjunto interno en que en ellos las referencias a entidades de parámetros están permitidas dentro de declaraciones de marcadores (no sólo entre declaraciones de marcadores).
Ejemplo de un documento XML con una declaración de tipos del documento:
<?xml version="1.0"?>
<libro></libro>
Las declaraciones también pueden ser hechas a nivel local:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE libro [
<!ELEMENT libro (#PCDATA)>
]>
<libro>Contenido del libro</libro>
Otro ejemplo de declaración:
<!-- este es el DTD externo: circular.dtd -->
<!ELEMENT circular (a, de, titulo, contenido)>
<!ELEMENT a (#PCDATA)>
<!ELEMENT de (#PCDATA)>
<!ELEMENT titulo (#PCDATA)>
<!ELEMENT contenido (#PCDATA)>
<?xml version="1.0"?>
<!DOCTYPE circular SYSTEM "circular.dtd" [
<!ENTITY firma "felipe@micorreo.com" >
]>
<circular>
<a>Epsilon Eridani</a>
<de>Felipe</de>
<titulo>Especificacion XML</titulo>
<contenido>Ya esta casi terminada. &firma;</contenido>
</circular>
Declaración para documentos independientes
Las declaraciones de marcas pueden afectar al contenido del documento (por ejemplo al pasar desde un procesador XML a una aplicación).
La declaración de documento independiente indica las declaraciones que pueden aparecer en el exterior de la entidad de documento (document entity).
[32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"'))
[VC: Standalone Document Declaration ]
El valor ‘yes’ indica que no hay declaraciones de marcadores externas a la entidad de documento (ya sea en un suconjunto DTD externo o en una entidad de parámetros externa) que afecten a la información pasada desde el procesador XML a la aplicación.
El valor ‘no’ indica que hay o puede haber declaraciones externas.
Condición de validez: Declaración de documento independiente
La declaración de documento independiente debe tener el valor ‘no’ si cualquier declaración externa de marcadores contiene una declaración de:
- Atributos con valores por defecto (default), si los elementos a los que esos atributos son aplicados aparecen en el documento sin especificar un valor para esos atributos.
- Entidades (distintas de amp, lt, gt, apos, quot) si aparecen referencias a esas entidades en el documento.
- Atributos con valores sujetos a normalización cuando el atributo que aparece en el documento puede cambiar como resultado de una normalización.
- Tipos de elementos con contenido de elemento (element content) si un espacio en blanco aparece dentro de cualquier instancia de esos tipos..
Ejemplo de declaración para documento independiente:
<?xml version="1.0" standalone='yes' ?>
Tratamiento de los espacios en blanco
En el proceso de edición de documentos XML conviene utilizar espacios en blanco (espacios, tabulaciones, retornos de carro ) para separar los marcadores y conseguir documentos más legibles.
El procesador XML debe pasar siempre todos los caracteres en un documento (que no forman parte de una marca) a la aplicación. Un procesador de validación XML debe informar a la aplicación cuáles de esos caracteres son espacios en blanco que aparecen en el contenido de elemento.
Un atributo especial, llamado xml:space puede ser añadido a un elemento para indicar que los espacios en blanco deberían ser preservados por las aplicaciones. Este atributo debe ser declarado, como cualquier otro, si va a ser utilizado.
En la declaración se debe especificar un tipo enumerado con los valores ‘default’ y ‘preserve’:
<!ATTLIST poem xml:space (default|preserve) 'preserve' >
El valor ‘default’ indica a la aplicación que los modos de procesamiento de espacios en blanco por defecto son aceptables para este elemento. El valor ‘preserve’ le indica que los espacios deben ser preservados.
Manejo de los finales de línea (EoL)
Las entidades XML con formato (parsed entities) son almacenadas a veces en ficheros que son organizados en líneas.
Estas líneas suelen utilizar como separadores los caracteres ‘retorno de carro’ (#xD) y ‘avance de línea’ (#xA).
Con el fin de facilitar la labor de las aplicaciones, el procesador XML debe pasar a la aplicación un sólo carácter #xA.
Identificación del idioma
A menudo es útil identificar el idioma en el que está escrito el contenido del documento.
El atributo xml:lang se utiliza para especificar el idioma en el que están escritos los contenidos y los valores de atributos.
[33] LanguageID ::= Langcode ('-' Subcode)*
[34] Langcode ::= ISO639Code | IanaCode | UserCode
[35] ISO639Code ::= ([a-z] | [A-Z]) ([a-z] | [A-Z])
[36] IanaCode ::= ('i' | 'I') '-' ([a-z] | [A-Z])+
[37] UserCode ::= ('x' | 'X') '-' ([a-z] | [A-Z])+
[38] Subcode ::= ([a-z] | [A-Z])+
El código del lenguaje (Langcode) puede ser:
- Un código de dos letras (p.e. ES) definido en ISO 639
- Un identificador de lenguaje registrado por IANA (Internet Assigned Numbers Authority). Comienza por el prefijo ‘i’ o ‘I’
- Un identificador de lenguaje asignado por el usuario. Prefijo ‘x’ o ‘X’
Puede haber cualquier número de segmentos de subcódigo.
<p xml:lang="es">Hola, una prueba</p>
<p xml:lang="en">Hi, this is a test</p>
Una declaración para xml:lang puede tomar la forma más simple:
xml:lang NMTOKEN #IMPLIED
Pero también se pueden proporcionar valores por defecto. Por ejemplo:
<!ATTLIST poema xml:lang NMTOKEN 'fr'>
<!ATTLIST cancion xml:lang NMTOKEN 'es'>