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;>
- Obsérvese que, en la DTD se ha declarado la entidad paramétrica p y, para referenciarla, se utiliza la sintaxis:
%nombre-de-la-entidad;
Si este documento XML se visualizase en un navegador web, se vería algo similar a:
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;>