Tutoriales de informática - Abrirllave.com

Abrirllave.com

Entidades paramétricas internas analizables en DTD

Para declarar una entidad paramétrica (de parámetro) interna analizable (parsed) en una DTD, se utiliza la siguiente sintaxis:

<!ENTITY % nombre-de-la-entidad "valor-de-la-entidad">

EJEMPLO La DTD del siguiente documento XML es externa, habiéndose escrito esta en el archivo "persona.dtd":

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE persona SYSTEM "persona.dtd">

<persona>
   <nombre>Iker</nombre>
   <mayor_de_edad/>
   <ciudad>Pamplona</ciudad>
</persona>

El contenido del archivo "persona.dtd" podría ser:

<!ENTITY % p "(#PCDATA)">

<!ELEMENT persona (nombre, mayor_de_edad?, ciudad)>
<!ELEMENT nombre %p;>
<!ELEMENT mayor_de_edad EMPTY>
<!ELEMENT ciudad %p;>
%nombre-de-la-entidad;

Si este documento XML se visualizase en un navegador web, se vería algo similar a:

Visualización del archivo persona.xml en Google Chrome - Ejemplo del tutorial de DTD de {Abrirllave.com

Las entidades de parámetro se declaran antes de referenciarlas

En una DTD las entidades paramétricas tienen que declararse antes de ser referenciadas. Por tanto, no sería correcto haber escrito, por ejemplo:

<!ELEMENT persona (nombre, mayor_de_edad?, ciudad)>
<!ELEMENT nombre %p;>
<!ELEMENT mayor_de_edad EMPTY>
<!ELEMENT ciudad %p;>

<!ENTITY % p "(#PCDATA)">

A una entidad paramétrica interna no se le puede referenciar en una DTD interna

Las entidades paramétricas internas pueden declararse en DTD internas o externas. Sin embargo, no pueden referenciarse desde una DTD interna. En consecuencia, el siguiente documento no sería válido:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE persona [
   <!ENTITY % p "(#PCDATA)">

   <!ELEMENT persona (nombre, mayor_de_edad?, ciudad)>
   <!ELEMENT nombre %p;>
   <!ELEMENT mayor_de_edad EMPTY>
   <!ELEMENT ciudad %p;>
]>

<persona>
   <nombre>Iker</nombre>
   <mayor_de_edad/>
   <ciudad>Pamplona</ciudad>
</persona>

Declaración de una entidad paramétrica en la DTD interna de un documento XML y referenciada en la DTD externa

Ahora bien, sí sería válido el siguiente documento XML, donde internamente se declara la entidad paramétrica p:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE persona SYSTEM "persona.dtd" [
   <!ENTITY % p "(#PCDATA)">
]>

<persona>
   <nombre>Iker</nombre>
   <mayor_de_edad/>
   <ciudad>Pamplona</ciudad>
</persona>

En este caso, el contenido del archivo "persona.dtd" podría ser:

<!ELEMENT persona (nombre, mayor_de_edad?, ciudad)>
<!ELEMENT nombre %p;>
<!ELEMENT mayor_de_edad EMPTY>
<!ELEMENT ciudad %p;>