Saltar al contenido principal

Entidades paramétricas

Las entidades paramétricas solo pueden utilizarse únicamente dentro de un DTD.

A su vez, se pueden subdividir en dos tipos:

  • Entidades paramétricas internas.
  • Entidades paramétricas externas.

Internas

Una entidad paramétricas interna es aquella que define el valor de la entidad en el propio DTD, en la misma línea donde se declara.

La declaración de una entidad general interna tiene la siguiente sintaxis:

<!ENTITY % name "content">

La sintaxis se diferencia de la entidad general interna por el caracter %.

Para utilizar una entidad de este tipo, debemos seguir la siguiente sintaxis:

%name;

Las entidades paramétricas tienen que declararse antes de ser referenciadas.

A continuación, un ejemplo completo de su uso:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE ciudad SYSTEM "ciudad.dtd">
<ciudad>
<nombre>Santiago de Compostela</nombre>
<pais>España</pais>
</ciudad>

El documento ciudad.dtd contiene las siguientes líneas:

<!ENTITY % texto "(#PCDATA)">
<!ELEMENT ciudad (nombre, pais)>
<!ELEMENT nombre %texto;>
<!ELEMENT pais %texto;>
Uso en DTD interno

Las entidades paramétricas deben definirse siempre en un DTD externo, es decir, en un fichero. Es posible definir entidades paramétricas en un DTD interno (incluido en el propio fichero XML), pero solo es posible utilizarlas en un DTD externo.

Lo siguiente no sería válido:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ciudad [
<!ENTITY % texto "(#PCDATA)">
<!ELEMENT ciudad (nombre, pais)>
<!ELEMENT nombre %texto;>
<!ELEMENT pais %texto;>
]>
<ciudad>
<nombre>Santiago de Compostela</nombre>
<pais>España</pais>
</ciudad>

Sin embargo, lo siguiente sería válido:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE ciudad SYSTEM "ciudad.dtd" [
<!ENTITY % texto "(#PCDATA)">
]>
<ciudad>
<nombre>Santiago de Compostela</nombre>
<pais>España</pais>
</ciudad>
ciudad.dtd
<!ELEMENT ciudad (nombre, pais)>
<!ELEMENT nombre %texto;>
<!ELEMENT pais %texto;>

Externas

Una entidad paramétricas externa es aquella que define el valor de la entidad de manera externa, es decir, en otro fichero. El fichero debe ser referenciado en la propia línea de la declaración.

Según el tipo de fichero referenciado, se pueden declarar dos tipos de entidades paramétricas externas:

  • Privadas.
  • Públicas.

Privadas

Una entidad paramétricas externa privada es aquella donde el fichero referenciado es un fichero que no es público.

La declaración de una entidad paramétrica externa privada tiene la siguiente sintaxis:

<!ENTITY % name SYSTEM "URI">

La sintaxis se diferencia de la entidad general externa privada por el caracter %.

A continuación, un ejemplo completo de su uso:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE texto [
<!ENTITY % texto SYSTEM "texto.dtd">
%texto;
]>
<texto>Este documento está escrito en XML.</texto>

El contenido de texto.dtd es el siguiente:

<!ELEMENT texto (#PCDATA)>

Cuando un procesador XML interpreta el documento anterior, lo que hace es substituir la ocurrencia %texto; por el contenido de texto.dtd, que es <!ELEMENT texto (#PCDATA)>.

Es decir, el código anterior es equivalente al siguiente:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE texto [
<!ELEMENT texto (#PCDATA)>
]>
<texto>Este documento está escrito en XML.</texto>

Públicas

Una entidad paramétrica externa pública es aquella donde el fichero referenciado es un fichero público, es decir, está accesible desde una URI pública.

La declaración de una entidad paramétrica externa pública tiene la siguiente sintaxis:

<!ENTITY % name PUBLIC "id" "URI">

La sintaxis se diferencia de la entidad general externa pública por el caracter %.

A continuación, un ejemplo completo de su uso:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE texto [
<!ENTITY % texto PUBLIC "-//W3C//TEXT texto//EN" "https://mp0373-lmsxi.vercel.app/ud04/texto.dtd">
%texto;
]>
<texto>Este documento está escrito en XML.</texto>

El contenido de texto.dtd es el siguiente:

<!ELEMENT texto (#PCDATA)>

Cuando un procesador XML interpreta el documento anterior, lo que hace es substituir la ocurrencia %texto; por el contenido de texto.dtd remoto, que es <!ELEMENT texto (#PCDATA)>.

Es decir, el código anterior es equivalente al siguiente:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE texto [
<!ELEMENT texto (#PCDATA)>
]>
<texto>Este documento está escrito en XML.</texto>