<!ELEMENT svg (rect*, circle*, path, line, polyline, polygon, ellipse)>
<!ATTLIST svg
version (1.1 | 1.2 | 2) #REQUIRED
width CDATA #REQUIRED
height CDATA #REQUIRED
>
<!ELEMENT rect EMPTY>
<!ELEMENT line EMPTY>
<!ATTLIST rect
x CDATA #REQUIRED
y CDATA #REQUIRED
width CDATA #REQUIRED
height CDATA #REQUIRED
fill (blue | pink | red | green | black | white | orange) #REQUIRED
stroke (blue | pink | red | green | black | white | orange) #REQUIRED
stroke-width CDATA #REQUIRED
>
DTD (Document Type Declaration) es un documento de texto plano que sirve para verificar la validez de la estructura del documento XML y de su contenido mediante unas reglas. Estas reglas definen el jerarquía y orden, tipo de contenido, atributos asociados y la integridad de los elementos.
Limitaciones:
- No soportan espacios de nombres.
- No definen tipos para los datos.
- No permite las secuencias no ordenadas.
- No es posible formar claves a partir de varios atributos o elementos.
- Una vez que se define DTD, no es posible añadir nuevos vocabularios.
Comentarios:
DTD permite poner comentarios en todo el código menos dentro de declaraciones de elementos o atributos, sintaxis:
<!-- MENSAJE -->
Sintaxis:
En la siguiente etiqueta se deben de respetar un espacio mínimo entre cada objeto.
<!ELEMENT elemento (opciones)>
elemento: Nombre del elemento a declarar.
1. Podemos decir que el contenido de una etiqueta puedea no tener nada o tener una cadena de texto - PCDATA (Parsed Character Data) pero sin contar los caracteres reservados en XML.
<!ELEMENT elemento (#PCDATA)>
Solo daría error si se ponen sub-etiquetas dentro.
2. El contenido de la etiqueta debe estar obligatoriamente vacío sin ninguna cadena de texto ni sub-etiquetas dentro, sin contar los atributos.
<!ELEMENT elemento EMPTY>
3. El contenido de la etiqueta pueda ser una cadena de texto, puede tener sub-etiquetas dentro, puede tener ambos o no tener nada (todo está permitido).
<!ELEMENT elemento ANY>
4. En el contenido de la etiqueta padre debe tener ciertas sub-etiquetas hijo dentro en el orden especificado.
<!ELEMENT elemento (etiqueta1, etiqueta2, ...)>
Si están todas las etiquetas dentro pero en un orden diferente al especificado dará un error al validar el documento XML.
5. En el contenido de la etiqueta padre debe tener en una posición solo una sub-etiqueta y no todas.
<!ELEMENT elemento (etiqueta1 | etiqueta2 | ...)>
En ese caso se debe tener dentro de la etiqueta <elemento> la sub-etiqueta <etiqueta1> o <etiqueta2> pero nunca ambas.
6. En el contenido de la etiqueta padre debe tener una sub-etiqueta o una cadena de texto pero no ambos.
<!ELEMENT elemento (#PCDATA | etiqueta1 | ...)>
#PCDATA siempre tiene que estar en primer lugar o se producirá un error.
Podemos definir que se pueda elegir entre una <etiqueta1> o una <etiqueta2> y que luego se ponga la <etiqueta3> en el siguiente ejemplo:
<!ELEMENT elemento ((etiqueta1 | etiqueta2), etiqueta3, ...)>
Podemos definir que se pueda elegir una <etiqueta1> seguido de la <etiqueta2> o solo la <etiqueta3> en el siguiente ejemplo:
<!ELEMENT elemento ((etiqueta1, etiqueta2) | etiqueta3, ...)>
Con el símbolo ? podemos definir una cardinalidad de 0-1.
<!ELEMENT elemento (etiqueta1+)>
Sería válido poner ninguna etiqueta <etiqueta1> o solo una.
Con el símbolo + podemos definir una cardinalidad de 1-n.
<!ELEMENT elemento (etiqueta1+)>
Sería válido poner mínimo una etiqueta <etiqueta1> o muchas (sin límite).
Con el símbolo * podemos definir una cardinalidad de 0-n.
<!ELEMENT elemento (etiqueta1*)>
Sería válido poner ninguna etiqueta <etiqueta1> o muchas (sin límite).
En el siguiente caso se elige entre <etiqueta1> o <etiqueta2> y de la elección se puede poner ninguna o solo una vez:
<!ELEMENT elemento ((etiqueta1 | etiqueta2)?, ...)>
En vez de ? se puede poner las otras 2 cardinalidades posibles como + o * y lo que cambiaría sería la cantidad de veces que se pueda poner la etiqueta elegida.
En el siguiente caso se puede poner <etiqueta1> y <etiqueta2> (en ese orden) la cantidad de veces que la cardinalidad lo permita. Ejemplo:
<!ELEMENT elemento ((etiqueta1, etiqueta2)+, ...)>
Sintaxis:
En la siguiente etiqueta se deben de respetar un espacio mínimo entre cada objeto.
<!ATTLIST elemento atributo tipo predefinido>
elemento: Nombre del elemento que contenga el atributo a declarar.
atributo: Nombre del atributo a declarar.
tipo: Tipo de contenido que puede tener el atributo.
valor: Define si el atributo es obligatorio y si tiene un valor fijo.
Se puede definir varios atributos de un elementos en un mismo <!ATTLIST> como:
<!ATTLIST
elemento1 atributo1 tipo1 predefinido1
elemento2 atributo2 tipo2 predefinido2
...
>
En el apartado "predefinido" se puede definir que un atributo sea opcional - #IMPLIED:
<!ATTLIST elemento atributo tipo #IMPLIED>
O requerido / obligatorio - #REQUIRED:
<!ATTLIST elemento atributo tipo #REQUIRED>
Además se puede definir un valor fijo - #FIXED "valor":
<!ATTLIST elemento atributo tipo #FIXED "valor_fijo">
El valor es sensible a mayúsculas y, si no coincide exactamente con lo definido, dará un error en la validación.
Por último, se puede poner solo un valor predefinido en caso de que no se asigne solo de las siguientes formas:
<!ATTLIST elemento atributo CDATA "valor_predefinido">
<!ATTLIST elemento atributo (valor1|valor2) "valor1">
En cualquier caso, si se especifica otro valor distinto, se omitirá el valor predefinido. Se aplica automaticamente el valor predefinido en caso de no asignárselo al momento de validación.
1. Que tenga unos valores predefinidos válidos.
<!ATTLIST elemento atributo (valor1|valor2|...) predefinido>
En el ejemplo se define que un <elemento> tenga solo ciertos valores válidos.
2. Que tenga una cadena de caracteres o ningún valor - CDATA (Parsed Character Data).
<!ATTLIST elemento atributo CDATA predefinido>
Dentro del atributo sí se permite el uso de caracteres reservados de XML.
3. Que tenga una cadena de caracteres que cumpla con las reglas de nombres de XML - NMTOKEN (Name Token).
<!ATTLIST elemento atributo NMTOKEN predefinido>
Dentro del atributo no se permite el uso de espacios ni de ningún símbolo reservado.
4. Que tenga una lista de varios NMTOKEN separados por espacios - NMTOKENS.
<!ATTLIST elemento atributo NMTOKENS predefinido>
5. Que sea un identificador único para cada elemento - ID.
<!ATTLIST elemento atributo ID predefinido>
Reglas:
1. Cada elemento solo puede tener un atributo de tipo ID.
2. El valor predefinido solo puede ser #IMPLIED o #REQUIRED.
3. La primera letra del valor debe ser una letra o un _.
4. El valor del ID no debe repetirse en otros IDs.
6. Que sea una referencia a identificador único existente - IDREF.
<!ATTLIST elemento atributo IDREF predefinido>
Reglas:
1. Dará error de validación si no hay un atributo ID con ese valor.
2. El valor predefinido solo puede ser #IMPLIED o #REQUIRED.
7. Es una lista de varios IDREF separados por espacios - IDREFS.
<!ATTLIST elemento atributo IDREFS predefinido>
Los valores que contengan tienen que existir en otros atributos ID del documento XML.
Reglas:
1. Dará error de validación si no hay un atributo ID uno de los valores de la lista.
2. El valor predefinido solo puede ser #IMPLIED o #REQUIRED.
Puede referenciar por ejemplo a varios elementos <pais> donde cada uno tenga un ID con una abreviatura de su nombre.
En IDREFS se podría poner "es fr gl" haciendo referencia a varios paises en un solo elemento.
8. Que sea la representación de una entidad externa - ENTITY.
9. Que sea una lista de varias representaciones de una entidad externa - ENTITIES.
10. Que sea el nombre de una notación - NOTATION.
Una entidad puede almacenar cualquier tipo de contenido e insertarlo en el documento XML. Se almacena en el documento DTD o en un fichero externo. Es útil ya que el valor asociado a un nombre puede ser fácilmente editado desde un solo lugar en vez de en todos los lugares a los que se le quiera asignar ese valor.
Entidades predefinidas por xml:
En la guía sobre XML se trata el uso de entidades predefinidas como por ejemplo < que tiene como valor <.
| REFERENCIAS | |
| SÍMBOLO | PREDEFINIDAS |
| < | < |
| > | > |
| & | & |
| ' | ' |
| " | " |
Entidades generales internas:
Podemos crear nuestras propias entidades con la siguiente sintaxis:
<!ENTITY nombre "valor">
nombre: Nombre que asignaremos a la entidad.
valor: Contenido que se insertará en el documento XML cuando se llame.
Ejemplo de una entidad personalizada:
<!ENTITY dtd "Document Type Definition">
Ahora se podrá llamar a la entidad mediante &dtd; y este devolverá el valor Document Type Definition.
En el editor no aparecerá el valor, sino cuando se procese el documento como por ejemplo en un navegador.
Una entidad general externa es aquella que define el valor de la entidad en otro fichero.
Entidades generales externas privadas:
Sintaxis:
<!ENTITY nombre SYSTEM "URI">
nombre: Nombre que asignaremos a la entidad.
SYSTEM: Se indica que es un recurso privado.
"URI": span_contenido al fichero cuyo contenido es el valor a asignar como entidad.
Ejemplo:
<!ENTITY dtd SYSTEM "descripcion.txt">
Ahora se podrá llamar a la entidad mediante &dtd; y este devolverá el contenido del archivo descripcion.txt.
Entidades generales externas públicas:
Sintaxis:
<!ENTITY nombre PUBLIC "ID" "URI">
nombre: Nombre que asignaremos a la entidad.
PUBLIC: Se indica que es un recurso público.
"ID": Identificador público que permiten localizar recursos DTD. Normalmente tiene formato FPI (Formal Public Identifier).
"URI": span_contenido al fichero cuyo contenido es el valor a asignar como entidad.
Ejemplo:
<!ENTITY dtd PUBLIC "-//W3C//TEXT dtd//EN" "https://byad12.pages.dev/robots.txt">
Ahora se podrá llamar a la entidad mediante &dtd; y este devolverá el contenido del archivo alojado en la URI asignada.
Una entidad paramétrica solo pueden definirse en un DTD interno pero solo se pueden usar en un documento DTD a parte del documento XML. Tampoco pueden llamarse a estas entidades en el XML, solo es de uso interno en el documento DTD.
Sintaxis:
<!ENTITY % nombre "valor">
%: Se indica que es una entidad paramétrica.
nombre: Nombre que asignaremos a la entidad.
"valor": Contenido que se insertará en el documento XML cuando se llame.
Ejemplo:
Podemos llamar a una entidad mediante %str; para indicar que se espera una cadena de caracteres:
<!ENTITY % str "(#PCDATA)">
<!ELEMENT nombre_elemento %str;>
También podemos evitar escribir nombres de elementos largos y reemplazarlos por una entidad:
<!ENTITY % uk "reino-unido-de-gran-bretana-e-irlanda-del-norte">
<!ELEMENT %uk; EMPTY>
<!ATTLIST %uk; capital CDATA #REQUIRED>
Se pueden llamar a entidades desde otras entidades como en el siguiente ejemplo:
<?xml version="1.0"?>
<!DOCTYPE etiqueta [
<!ELEMENT etiqueta (#PCDATA)>
<!ENTITY saludo "Hola">
<!ENTITY nombre "Ruth">
<!ENTITY frase "&saludo;, soy &nombre;.">
]>
<etiqueta>&frase;</etiqueta>
Resultado final:
<etiqueta>Hola, soy Ruth.</etiqueta>
Limitaciones:
- Una entidad no puede llamarse a si misma.
- 2 entidades no se pueden llamar entre sí - de manera circular.
Una entidad paramétrica externa es aquella que define el valor de la entidad en otro fichero.
Entidades paramétricas externas privadas:
Sintaxis:
<!ENTITY % nombre SYSTEM "URI">
%: Se indica que es una entidad paramétrica.
nombre: Nombre que asignaremos a la entidad.
SYSTEM: Se indica que es un recurso privado.
"URI": span_contenido al fichero cuyo contenido es el valor a asignar como entidad.
Ejemplo:
<!ENTITY % entidad_nueva SYSTEM "descripcion.dtd">
%entidad_nueva;
El archivo descripcion.dtd contiene:
<!ELEMENT etiqueta_nueva (#PCDATA)>
Así que en el DTD se reemplazará %etiqueta_nueva; por el contenido del archivo, quedando el siguiente resultado:
<!ENTITY % entidad_nueva SYSTEM "descripcion.dtd">
<!ELEMENT etiqueta_nueva (#PCDATA)>
Entidades paramétricas externas públicas:
Sintaxis:
<!ENTITY % nombre PUBLIC "ID" "URI">
%: Se indica que es una entidad paramétrica.
nombre: Nombre que asignaremos a la entidad.
PUBLIC: Se indica que es un recurso público.
"ID": Identificador público que permiten localizar recursos DTD. Normalmente tiene formato FPI (Formal Public Identifier).
"URI": span_contenido al fichero cuyo contenido es el valor a asignar como entidad.
Ejemplo (El funcionamiento es igual que la entidad paramétrica externa privada):
<!ENTITY % entidad_nueva PUBLIC "-//W3C//TEXT texto//EN" "https://byad12.pages.dev/descripcion.dtd">
%entidad_nueva;