DTD Definici贸n de Tipos de Documentos
Se pueden escribir directamente documentos XML sin realizar una DTD previa. Este modo de trabajo debe emplearse de forma restringida. Consecuencias:
1.
Se pierde la posibilidad de crear un lenguaje de etiquetado específico para un determinado campo.
2.
No se pueden validar automáticamente los documentos escritos en dicho lenguaje.
Si existe un DTD el parser podrá comprobar no sólo que el documento está bien formado, sino que los documentos siguen las reglas del lenguaje creado y son válidos.
Profesionalmente, antes de elaborar cualquier documento es imprescindible la especificación del DTD que defina el lenguaje de etiquetado.
En grandes empresas un grupo de personas con conocimientos avanzados crearían los DTD y otro grupo de personas se dedicarían a elaborar documentos válidos para ese DTD que tienen que ser capaces de saber interpretar.
El DTD contiene un conjunto de declaraciones de etiquetado que definen la gramática del nuevo lenguaje.
Declaración del DTD Forma parte del prólogo del documento, aparece después de la declaración XML (si existe). 1.
Puede incluir directamente declaraciones de etiquetado (subconjunto interno) y/o hacer referencia a entidades externas (normalmente un archivo) que contienen declaraciones de etiquetado (subconjunto externo).
2.
Debe especificar cuál es el elemento raíz del documento.
Sintaxis: <! DOCTYPE elemento_raiz referencia_externa [ declaraciones internas aquí ]>
Si sólo hay declaraciones internas, el documento es autónomo. Uno de los objetivos de XML es la creación de distintos lenguajes estándar de etiquetado para distintos campos de aplicación. Podemos hacer uso de declaraciones estándar ya publicadas haciendo referencia a ellas.
Existen dos tipos de referencias externas: 1.
DTD no publicados, se especifica la palabra SYSTEM y despues la URL donde está el DTD. <! DOCTYPE elemento_raiz SYSTEM “archivo_declaraciones.dtd”>
2.
DTD publicado, se utiliza la palabra PUBLIC seguida por el identificador público asociado a ese DTD estándar y la URL donde se encuentra (será usada sólo si no se puede localizar el DTD usando el identificador público) <! DOCTYPE elemento_raiz PUBLIC “-//OASIS//DTD DocBook XML V4.2//EN” “http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd”>
Si un DTD tiene declaraciones internas y externas, las primeras tienen más prioridad que las segundas. Lo que permite adaptar DTD externos mediante declaraciones propias.
Declaración de tipos de elementos En el DTD hay que incluir la declaración de los distintos tipos de elementos que forman parte del documento. La declaración de un tipo de elemento debe indicar el nombre del elemento (válido según reglas vistas, conteniendo letras, dígitos, puntos, guiones y subrayados pero no espacios en blanco) y su contenido. Una declaración por elemento. Sintaxis: <!ELEMENT nombre tipo_contenido>
Elementos vacĂos Se declaran especificando la palabra EMPTY. <!ELEMENT nombre EMPTY>
Elementos que contienen s贸lo datos En la declaraci贸n se especifica #PCDATA. <!ELEMENT nombre (#PCDATA)>
Elementos que sólo contienen elementos XML define una pequeña gramática de expresiones regulares, que permite especificar qué elementos hijos puede contener un elemento y en qué orden pueden aparecer. Aparecen dos tipos de relaciones entre elementos hijos:
1.
Secuencia: el elemento contiene una secuencia de los elementos hijos especificados (indica orden). La declaración especifica la lista de los elementos hijos separados por comas. <!ELEMENT nombre_elemento (elemento_hijo1, elemento_hijo2, ..., elemento_hijoN)>
2.
Alternativa: El elemento contiene uno y s贸lo uno de los elementos especificados. <!ELEMENT nombre_elemento (elemento_hijo1 | elemento_hijo2 | ..., elemento_hijoN)>
Podemos indicar cuántas veces aparece cada hijo, una secuencia de hijos o una relación alternativa (estos dos últimos casos empleando paréntesis para agrupar)
* Repetición cero o un número ilimitado de veces. <!ELEMENT nombre_elemento (elemento_hijo1, elemento_hijo2*, ..., elemento_hijoN)>
? Opcionalidad. El elemento o grupo afectado puede aparecer (una sola vez) o no aparecer <!ELEMENT nombre_elemento (elemento_hijo1, elemento_hijo2?, ..., elemento_hijoN)>
+ Repetición una o un número ilimitado de veces. <!ELEMENT nombre_elemento (elemento_hijo1+, elemento_hijo2, ..., elemento_hijoN)>
Estos “operadores” se pueden combinar para crear definiciones bastante complejas.
Elementos con contenido mixto (elementos y datos) Limitaciones del modelo: ●
Permite un control limitado sobre la disposición de los elementos hijos y cómo se entremezclan con los datos.
●
Sólo se puede especificar qué elementos hijos aparecerán sin establecer su frecuencia de repetición o si forman parte de una secuencia o lista alternativa. <!ELEMENT elemento (#PCDATA | a | b | c)*> Esta declaración indica que “elemento” tendrá un contenido mixto donde podrá aparecer cualquiera de los elementos un número ilimitado de veces mezclados con texto.
<!ELEMENT elemento (#PCDATA | a | b | c)*> Se trata de un formato rígido de declaración: ●
En primer lugar debe aparecer #PCDATA
●
Debe especificarse una lista alternativa
●
No se pueden aplicar caracteres de repetición a los elementos hijos
●
Debe aplicarse obligatoriamente el carácter * al grupo de elementos
Declaración de tipos de atributos Los atributos deben declararse en el DTD Una única declaración para definir una lista de atributos asociados a un elemento <!ATTLIST elemento atrib1 tipo1 defecto1 atrib2 tipo2 defecto2 ...> Puede haber múltiples definiciones de listas de atributos para un mismo elemento o pueden aparecer todos en la misma declaración
Tipos de atributos: CDATA, NMTOKEN, NMTOKENS CDATA Indica que se trata de una cadena de caracteres. Puede incluir cualquier carácter, a excepción de los especiales, incluidos espacios. NMTOKEN Limita el tipo de caracteres que pueden aparecer como valor de un atributo a los caracteres que pueden usarse en el nombre de un elemento o atributo (letras, dígitos, puntos, guiones y subrayados, nunca espacios en blanco) NMTOKENS El valor del atributo puede ser una lista de cadenas de tipo NMTOKEN.
Tipos de atributos: enumerados Indican que el valor de un atributo estĂĄ restringido a un conjunto de valores. Se usa el carĂĄcter | para separar los valores posibles <!ATTLIST elemento atrib (valor1 | valor2 | valor3 | â&#x20AC;Ś ) >
Tipos de atributos: ID, IDREF, IDREFS Los elementos, a veces, tienen asociado un atributo que los identifica de forma unívoca (dni para una persona, dirección MAC de una máquina, código de una norma ISO, …) En un documento no puede haber dos atributos de tipo ID que almacenen el mismo valor, aunque pertenezcan a elementos distintos. El parse nos daría error. Un atributo ID sólo puede almacenar un valor que sea un nombre XML válido (no puede empezar por un carácter numérico). La existencia de un identificador asociado a un elemento permite que otros elementos dentro del documento puedan hacer referencia a él. El parser XML se encarga de asegurar que toda referencia que aparece en el documento se corresponda con un identificador existente en el mismo.
Valores por defecto para los atributos Información que aparece en la declaración de un atributo detrás del nombre y el tipo. Especifica cómo debe comportarse el parser ante la presencia o ausencia de este atributo en un elemento del documento. Posibilidades: ●
#REQUIRED Atributo obligatorio Todo elemento que aparezca en el documento debe incluir este atributo
●
#IMPLIED Opcional. Valor por defecto en un atributo. Puede no aparecer.
●
Valor por defecto Si en el documento aparece el atributo asociado al elemento, el parser le pasará a la aplicación el valor especificado. En caso de no aparecer, se le proporcionará el valor por defecto especificado en la declaración.
●
#FIXED El atributo tendrá un valor fijo especificado en la declaración. Si aparece el valor en el documento deberá tener ese valor o se producirá un error. Si no aparece, el parser proporcionará a la aplicación ese valor fijo.
Entidades En t茅rminos generales, una entidad permite dar un nombre (nombre XML v谩lido) a un texto y usarlo en su lugar. Las entidades pueden mejorar la modularidad y legibilidad tanto de un DTD como de un documento. Declaraci贸n de entidades en un DTD: <!ENTITY declaraci贸n_de_identidad >
Las entidades se clasifican en función de dos criterios: ●
●
La información que contienen ○
Entidades generales
○
Entidades parámetro
Dónde está localizada la información contenida ○
Entidades internas (se encuentran en el propio documento)
○
Entidades externas (fuera del documento)
Entidades generales Permite dar un nombre a un fragmento de documento XML. Se define dentro del DTD (como todas las entidades) pero se usa dentro del propio documento. Entidades de este tipo son las ya conocidas entidades predefinidas (&lt; &gt; &amp;...) Dependiendo de la localizaciĂłn de la informaciĂłn tenemos: â&#x2014;?
Entidades generales internas
â&#x2014;?
Entidades generales externas
Entidades generales internas La declaración de la entidad contiene el fragmento del documento. <?xml version=”1.0”?> <!DOCTYPE elemento_raiz [ ... <!ENTITY nombre_entidad “fragmento_de_documento”> ... ]> <elemento_raiz> … &nombre_entidad; … </elemento_raiz>
Entidades generales externas La declaración de la entidad realiza una referencia externa a un documento que contiene un fragmento XML. Se usa la misma sintaxis que en la declaración del subconjunto externo, distinguiéndose referencias de tipo PUBLIC y SYSTEM). <?xml version=”1.0”?> <!DOCTYPE elemento_raiz [ ... <!ENTITY nombre_entidad tipo_referencia “fichero_con_fragmento”> ... ]> <elemento_raiz> … &nombre_entidad; … </elemento_raiz>
Entidades parámetro Una entidad parámetro permite dar un nombre a una información que se corresponde con un conjunto de declaraciones de una DTD. Una vez definida se puede referenciar desde cualquier parte de la DTD. Funcionan cuando la definición de las reglas del DTD se realiza en un archivo externo. Para hacer referencia a una entidad parámetro previamente definida: %nombre_entidad; Dependiendo de la localización de la información, tenemos: ●
Entidades parámetro internas
●
Entidades parámetro externas
Entidades parámetro internas Las declaraciones DTD que se asocian con la entidad aparecen directamente en la propia declaración de la entidad . …. <!ENTITY % nombre_entidad “declaración/es DTD” > …. %nombre_entidad; .…
Entidades parámetro externas En la declaración de la entidad se hace una referencia externa usando la misma sintaxis que en la definición de subconjunto externo del DTD.
….. <!ENTITY % nombre_entidad tipo_referencia “fichero_con_declaraciones” > ….. %declaraciones; …..
Entidades generales externas no procesables Existen otro tipo de entidades externas generales que contienen información que no es de tipo XML y que no será procesada por el parser (generalmente imágenes). Su inclusión en un documento requiere varios pasos:
1.
Declaración de una notación
2.
Definición de una entidad general no procesable
3.
Definición de un atributo de tipo ENTITY (y otro de tipo NOTATION) en el elemento al que se pretende vincular el archivo de datos.
Entidades generales externas no procesables 1. Declaración de una notación
<!NOTATION nombre_notacion tipo_referencia “idenfificador externo o formato”
Una notación permite asociar un nombre con la identificación de una aplicación capaz de procesar un determinado formato de datos (no de tipo XML) También sirve para especificar un formato de datos que no sea XML (image/gif, image/jpg, image/png...) Al ser una referencia externa podemos usar PUBLIC o SYSTEM
Ejemplos: <!NOTATION GIF89a PUBLIC “-//Compuserve//NOTATION Graphic Interchange Format 89a//EN”>
<!NOTATION GIF SYSTEM “image/gif”>
Entidades generales externas no procesables 2. Definición de una entidad general (no procesable)
<!ENTITY nombre tipo_referencia “fichero_con_datos” NDATA nombre_notacion >
Asociamos una entidad externa no procesable a la notación Incluirmos una referencia externa al archivo que contiene los datos (generalmente una imagen).
Ejemplos:
<!NOTATION GIF89a PUBLIC “-//Compuserve//NOTATION Graphic Interchange Format 89a//EN”> <!ENTITY logo SYSTEM “logotipo.gif” NDATA GIF89a> -------<!NOTATION GIF SYSTEM “image/gif”> <!ENTITY imagen SYSTEM “Imagen123.gif” NDATA GIF>
Entidades generales externas no procesables 3. Definición de un atributo de tipo ENTITY ( y otro de tipo NOTATION ) en el elemento al que se pretende vincular el archivo de datos
<!ATTLIST elemento atributoImagen ENTITY defecto1 atributoImagenFormato NOTATION defecto2 > …….. <elemento atributoImagen=”nombre_entidad”>
Secciones condicionales ●
Permiten incluir o excluir reglas en un DTD en función de condiciones.
●
Sólo se pueden utilizar en DTDs externos.
●
Su uso tiene sentido al combinarlas con referencias a entidades parámetro.
●
Existen dos tipos: ○
IGNORE
○
INCLUDE
○
IGNORE <! [IGNORE[ declaraciones DTD ]]>
○
INCLUDE <! [INCLUDE[ declaraciones DTD ]]>
○
Limitaciones de los DTD ●
Un DTD no es un documento XML, no se puede verificar si está bien formado.
●
No se pueden establecer restricciones sobre los valores de elementos y atributos (tipo de datos, tamaño, …)
●
No soporta espacios de nombres (Namespaces)
●
Sólo se pueden enumerar los valores de atributos, no de elementos.
●
Sólo se puede dar un valor por defecto a atributos, no a elementos.
●
Existe un control limitado sobre las cardinalidades de los elementos, no se puede concretar el número de veces que pueden aparecer.
Supongamos la siguiente situación: <?xml version=”1.0”?> <!ENTITY empleado SYSTEM “empleado.dtd”> <!ENTITY libro SYSTEM “libro.dtd”> %empleado; %libro; Todos los elementos y atributos pasan a formar un único espacio de nombres global. Si en ambas entidades externas se ha declarado un atributo con igual nombre y distintos proposito. Al procesar las referencias a estas entidades se producirá un error (se ha declarado dos veces el mismo elemento). Solución:
estándar Namespaces
Permite la existencia de distintos espacios de nombres de
manera que elementos y atributos definidos en distintos módulos no entren en conflicto.
Herramientas de generación automática de DTDs ●
Infieren a partir de un documento XML el DTD genérico que lo valide.
●
Muchas restricciones (reglas de negocio ) es necesario añadirlas manualmente.