Especificación XML 1.0

eXtensible Markup Language

 

Estructuras lógicas

Cada documento XML contiene uno o más elementos. Las fronteras entre elementos están delimitadas por inicios de marca y finales de marca o por elementos vacíos.

Cada elemento tiene un tipo, identificado por un nombre (identificador genérico - GI ), y puede tener un conjunto de especificaciones de atributo (con un nombre y un valor).

[39] element ::= EmptyElemTag | STag content ETag
[ WFC: Element Type Match ] [VC: Element Valid ]

El nombre en la marca de final de un elemento debe coincidir con el tipo de elemento especificado en la marca inicial.

Un elemento se considera válido si hay una declaración que coincide con ese elemento y además se cumple uno de los siguientes casos:

  • En la declaración se especifica EMPTY (vacío) y el elemento no tiene contenido
  • En la declaración se especifica ‘children’ (hijo) y la secuencia de elementos hijos generada por la expresión coincide con las secuencia especificada en el modelo de contenido.
  • En la declaración se especifica ‘Mixed’ y el contenido está compuesto por caracteres de datos y elementos hijos que concuerdan con el modelo de contenido.
  • En la declaración se especifica ‘ANY’ y los tipos de cualquier elemento hijo han sido declarados.

Ejemplo:

<!ELEMENT COCHE (PRECIO, DESCUENTO)>

<COCHE>
  <PRECIO> 1.000.000 pts </PRECIO>
  <DESCUENTO> 20% </DESCUENTO>
<COCHE>

 

Marcas de inicio y de final

Start-tag

[40] STag ::= '<' Name (S Attribute)* S? '>'
[ WFC: Unique Att Spec ]

[41] Attribute  ::= Name Eq AttValue [ VC: Attribute Value Type ]
[WFC: No External Entity References ] [WFC: No < in Attribute Values ]

El nombre en la marca de inicio y en la de final determina el tipo del elemento.

Los pares Name-AttValue hacen referencia a las especificaciones de atributos del elemento. Ningún nombre de atributo puede aparecer más de una vez en la misma marca.

El valor del atributo no puede contener (directa o indirectamente) referencias a entidades externas.

Ejemplo de marca de inicio:

<descuento tipo="contado" valor="5%">

El final de todos los elementos que comienzan con una marca de inicio debe ser indicado mediante la marca de finalización correspondiente.

 

End-tag

[42] ETag ::= '</' Name S? '>'

El texto situado entre la marca de comienzo y la de final es el contenido del elemento.

 

Contenido de un elemento

[43] content ::= (element | CharData | Reference | CDSect | PI | Comment)*

Si un elemento está vacío, debe ser representado por una marca de inicio seguida inmediatamente por una marca de final o por una marca de elemento vacío.

 

Marcas de elementos vacíos

[44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>'
        [WFC: Unique Att Spec ]

Las marcas de elementos no vacíos pueden ser utilizadas por cualquier elemento que no tenga contenido, haya sido declarado, o no, usando la palabra EMPTY. Las marcas de elementos vacíos deben ser usadas (y sólo pueden ser usadas) por elementos declarados EMPTY.

Ejemplo de elementos vacío:

<IMG align="left" src="imagen1.jpg" />

Elemento declarado no vacío, sin contenido:

<SALUDO tipo="informal"></SALUDO>

o también:

<SALUDO tipo="informal" />

 

Declaración de tipos de elementos

La estructura de los elementos de un documento XML debe ser especificada utilizando declaraciones de tipo de elemento y lista de atributos. Estas declaraciones determinan el contenido del elemento.

A veces las declaraciones de tipos también determinan qué tipos de elementos pueden aparecer como hijos del elemento en cuestión.

[45] elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>'
[VC: Unique Element Type Declaration ]

[46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children

Ningún tipo puede ser definido más de una vez.

Ejemplos de definiciones de tipos:

<!ELEMENT br EMPTY>
Se declara un elemento vacío llamado 'br'

<!ELEMENT p (#PCDATA|emph)* >
Se declara un elemento 'p' que puede contener cero o más apariciones de texto o de elementos 'emph'

<!ELEMENT container ANY>
Se declara un elemento 'container' que puede contener cualquier mezcla de elemento y texto.


Contenido de tipo 'elemento'

Un tipo de elemento con contenido de tipo 'elemento' es aquel en el que sus instancias (los elementos de ese tipo) sólo pueden contener elementos hijos (no texto). En este caso, la declaración incluye un modelo de contenido que determina los tipos permitidos como hijos y el orden en el que pueden aparecer.

Esta gramática se construye sobre partículas de contenido (content particles - cp’s) compuestas por nombres, listas de partículas opcionales o secuencias de partículas.

[47] children ::= (choice | seq) ('?' | '*' | '+')?
[48] Cp ::= (Name | choice | seq) ('?' | '*' | '+')?
[49] choice ::= '(' S? cp ( S? '|' S? cp )* S? ')'
[VC: Proper Group/PE Nesting ]

[50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')'
[VC: Proper Group/PE Nesting ]

Cada nombre (Name) es el tipo de un elemento que puede aparecer como hijo.

Cualquier partícula en una lista de partículas opcionales (choice) puede aparecer en el contenido del elemento en el lugar en el que aparece en la declaración. Las partículas de una secuencia (seq) deben aparecer en el orden especificado en la lista.

Los caracteres que siguen al nombre o la lista indican si el elemento o sus partículas en la lista pueden aparecer una o más veces (+), cero o más veces (*) o cero o una vez (?). Si no aparece ninguno de ellos quiere decir que la partícula debe aparecer una (y sólo una) vez.

El contenido de un elemento concuerda con un modelo de contenido si (y sólo si) es posible trazar un camino a través del modelo de contenido, cualquiera que sea la secuencia, elección y repetición de operadores y coincide en todos los casos el tipo de elemento con el modelo de contenido.

Se producirá un error si un elemento en el documento puede coincidir con más de un tipo de elemento en el modelo de contenido.

 

Condición de validez: Anidamiento de las entidades de parámetros
Validity Constraint: Proper Group/PE Nesting

El texto de sustitución de las entidades de parámetros debe ser correctamente anidado por medio de grupos (indicados mediante paréntesis). Si cualquiera de los paréntesis de apertura o cierre en una construcción del tipo lista de opciones (choice), secuencia (seq) o mezcla (Mixed) está contenido en el texto de sustitución para una entidad de parámetro, ambos deben ser contenidos en el mismo texto de sustitución.

Además, si aparece una referencia a una entidad de parámetros dentro de una secuencia, lista de opciones o mezcla, su texto de sustitución no debe estar vacío, y ni el primer carácter ni el último (sin contar los espacios en blanco) deben ser un conector ( | ó , ) (barra vertical o coma).

Ejemplos de modelos de contenido:

<!ELEMENT spec (front, body, back?)>
El elemento 'spec' tendrá como contenido un elemento 'front' (y sólo uno), un elemento 'body' (y sólo uno) y un elemento 'back' (o ninguno). Además, los tres elementos deben aparecer en ese orden.

<!ELEMENT div1 (head, (p | list | note)*, div2*)>
El elemento 'div1' tiene como contenido una secuencia constituida por:
   - Cero o más secuencias formadas por:
          - Un elemento 'head'
          - Seguido por cero o más
                    - Elemento 'p'
                    - o Elemento 'list'
                    - o Elemento note
   - Seguido por cero o más apariciones del elemento 'div2'

<!ELEMENT dictionary-body (%div.mix; | %dict.mix;)*>
El elemento 'dictionary-body' está formado por cero o más apariciones de:
   - El elemento o los elementos contenidos en el texto de sustitución de la entidad de parámetro 'div.mix'
   - o el elemento o los elementos contenidos en 'dict.mix'

 

Contenido mezclado (Mixed Content)

Un tipo tiene contenido mezclado cuando los elementos de ese tipo pueden contener datos junto con elementos hijos. En este caso, los tipos de los elementos hijos pueden ser especificados, pero no el orden ni el número de veces que pueden aparecer.

[51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' | '(' S? '#PCDATA' S? ')'
[VC: Proper Group/PE Nesting ] [ VC: No Duplicate Types ]

Como sucedía antes, el mismo nombre no puede aparecer más de una vez en una declaración de contenido mezclado.

<!ELEMENT p (#PCDATA|a|ul|b|i|em)*>
<!ELEMENT p (#PCDATA | %font; | %phrase; | %special; | %form;)* >
<!ELEMENT b (#PCDATA)>

 

Declaraciones de atributos

Los atributos son utilizados para asociar pares nombre-valor con elementos. Las especificaciones de atributos pueden aparecer sólo dentro de marcas de inicio y marcas de elementos vacíos. Las declaraciones de listas de atributos pueden ser usadas:

  • Para definir un conjunto de atributos de un tipo de elemento determinado
  • Para establecer especificaciones para esos atributos
  • Para proporcionar valores por defecto a los atributos.

Las declaraciones de listas de atributos especifican el nombre, el tipo de datos, y el valor por defecto (si es necesario) de cada atributo asociado con un determinado tipo de elemento.

Declaración de atributos:

[52] AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>'
[53] AttDef ::= S Name S AttType S DefaultDecl

El nombre en AttlistDecl es el tipo de un elemento. El procesador XML puede mostrar un mensaje de aviso si se declaran atributos para un tipo de elemento que no ha sido declarado (no es un error).

El nombre en AttDef es el nombre del atributo.

Cuando se especifica más de una AttlistDecl para un tipo de elemento, el contenido de todas ellas se mezcla.

Cuando se espedifica más de una definición para el mismo atributo de un elemento, la primera declaración es la que se tiene en cuenta y las demás son ignoradas.

 

Tipos de atributos

Los atributos en XML son de tres tipos: cadenas de caracteres, tipos compuestos (tokenized types) y tipos enumerados:

[54] AttType ::= StringType | TokenizedType | EnumeratedType
[55] StringType ::= 'CDATA'
[56] TokenizedType ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY' | 'ENTITIES'
| 'NMTOKEN' | 'NMTOKENS'
[VC: ID ] [VC: One ID per Element Type ][VC: ID Attribute Default ]

Requerimientos para ID

Los valores del tipo ID deben cumplir las condiciones impuestas por la regla 'Name'.
Un nombre no puede aparecer más de una vez en un documento XML como un atributo de otro elemento.
Ningún tipo puede tener más de un atributo ID especificado
Un atributo ID debe tener una declaración por defecto: #IMPLIED o #REQUIRED

Requerimientos para IDREF

Los valores del tipo IDREF deben coincidir con la especificación Name y los valores del tipo IDREFS deben coincidir con la especificación Names. Cada valor de IDREF o IDREFS debe coincidir además con el nombre de un atributo ID definido en algún elemento del documento.

Requerimientos para Entity Name

Los valores de tipo ENTITY deben coincidir con la especificación Name, y los de tipo ENTITIES con la especificación Names.
Cada valor de ENTITY o ENTITIES debe coincidir además con el nombre de una entidad del DTD.

Requerimientos para Name Token

Los valores de tipo NMTOKEN deben coincidir con la especificación Name, y los de tipo NMTOKENS con la especificación Names.

 

Atributos enumerados

Los atributos enumerados pueden tomar sólo valores de una lista de valores permitidos, proporcionados en la declaración. Hay dos tipos de atributos enumerados:

[57] EnumeratedType ::= NotationType | Enumeration
[58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')'
[ VC: Notation Attributes ]

[59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')'
[ VC: Enumeration ]

Un atributo NOTATION identifica una notación, declarada en el DTD con el sistema asociado y /o identificadores públicos. La notación será utilizada para interpretar el elemento en el que aparece dicho atributo.

Requerimientos para atributos NOTATION

Los valores de este tipo deben coincidir con alguno de los nombres incluidos en la declaración. Todos los nombres en la declaracion tienen que ser declarados.


Requerimientos para ENUMERATION

Los valores de este tipo deben coincidir con alguno de los que aparecen en la declaración.


Atributos por defecto

La declaración de un atributo proporciona información de si es obligatorio o no, y en este caso, cómo debería responder el procesador XML si encuentra que un atributo no está presente en un documento.

[60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue)         
        [VC: Required Attribute ] [VC: Attribute Default Legal ]
        [WFC: No < in Attribute Values ] [ VC: Fixed Attribute Default ]

La opción #REQUIRED implica que el atributo debe ser proporcionado siempre. El atributo debe ser especificado para todos los elementos de ese tipo en la declaración de atributos. Por el contrario, #IMPLIED significa que no se proporciona ningún valor por defecto.

Si no se especifican ninguna de las dos, el valor por defecto está en AttValue.

Si un atributo tiene un valor por defecto marcado como #FIXED, las instancias de ese atributo deben coincidir con el valor por defecto.

Ejemplos:

<!ATTLIST   termdef
        id ID #REQUIRED
        name CDATA #IMPLIED>

<!ATTLIST list
        type (bullets|ordered|glossary) "ordered">

<!ATTLIST form
         method CDATA #FIXED "POST">


Normalización de atributos y valores

Antes de pasar el valor de un atributo a una aplicación, el procesador XML debe normalizarlo:

  • Una referencia de carácter es procesada, añadiéndo su valor (carácter) al valor del atributo.
  • Una referencia de entidad es procesada recursivamente, añadiendo al valor del atributo su texto de sustitución.
  • Un carácter de espacio es procesado añadiendo #x20 al valor normalizado, teniendo en cuenta que sólo un #x20 es añadido para la secuencia "#xD#xA" si forma parte de una entidad con formato o del valor literal de una entidad con formato interna.
  • Los demás caracteres son procesados añadiéndolos al valor normalizado.

Si el valor declarado no es CDATA, el procesador XML debe procesar el valor normalizado del atributo, eliminando cualquier espacio (#x20) en su cabecera o su cola y sustituyendo las secuencias de espacios por un único carácter de espacio (#x20).

Todos los atributos que no tengan declaración deberán ser tratados como si hubieran sido declarados CDATA.

 

Secciones Condicionales

Son porciones del subconjunto externo de declaración de tipos que son incluidas o excluidas de la estructura lógica del DTD en función de su palabra clave.

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

Las secciones condicionales pueden contener una o más declaraciones completas, comentarios, instrucciones de procesamiento o secciones condicionales anidadas, todas ellas separadas por espacios en blanco.

Si la palabra clave de una sección condicional es INCLUDE, los contenidos de la sección condicional son parte del DTD.

Si la palabra clave es IGNORE, los contenidos no son parte del DTD.

Los contenidos de secciones IGNORE deben ser leídos, con el fin de detectar secciones condicionales anidadas en su interior y asegurar que el final de la sección (más externa) es detectado correctamente.

Si una sección INCLUDE aparece dentro de una sección condicional mayor IGNORE, tanto la sección interior como la exterior son ignoradas.

Si la palabra clave es una referencia a una entidad-parámetro, ésta será reemplazada por su contenido antes de que el procesador decida si debe incluir o ignorar la sección.

Ejemplos:

<!ENTITY % draft 'INCLUDE' >
<!ENTITY % final 'IGNORE' >
<![%draft;[
  <!ELEMENT book (comments*, title, body, supplements?)>
]]>
<![%final;[
  <!ELEMENT book (title, body, supplements?)>
]]>

 

Enlaces patrocinados:
Viajar por Extremadura - Webs amigas de ViajarPorExtremadura.com - Casas rurales, hoteles y alojamiento en Tierra de Barros - Badajoz - Extremadura - Casas rurales, apartamentos, hoteles y alojamiento en La Vera - Cáceres - Extremadura

 

Felipe Fernández Perera : Google+