Secciones condicionales
Es posible incluir o ignorar partes de la declaración de un DTD mediante las palabras clave INCLUDE
e IGNORE
, respectivamente.
El uso de las secciones condicionales suele estar ligado a entidades paramétricas.
La sintaxis es la siguiente:
<![ INCLUDE [ declaraciones ]]>
<![ IGNORE [ declaraciones ]]>
Consideremos el siguiente documento XML:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE persona SYSTEM "persona.dtd" [
<!ENTITY % datos_basicos "INCLUDE">
<!ENTITY % datos_ampliados "IGNORE">
]>
<persona>
<nombre>Elsa</nombre>
<edad>23</edad>
</persona>
El fichero persona.dtd
tiene el siguiente contenido:
<![ %datos_basicos; [
<!ELEMENT persona (nombre, edad)>
]]>
<![ %datos_ampliados; [
<!ELEMENT persona (nombre, apellidos, edad, ciudad)>
]]>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT apellidos (#PCDATA)>
<!ELEMENT edad (#PCDATA)>
<!ELEMENT ciudad (#PCDATA)>
Ambos archivos son equivalente al siguiente:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE persona SYSTEM "persona.dtd" [
<!ELEMENT persona (nombre, edad)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT apellidos (#PCDATA)>
<!ELEMENT edad (#PCDATA)>
<!ELEMENT ciudad (#PCDATA)>
]>
<persona>
<nombre>Elsa</nombre>
<edad>23</edad>
</persona>
Es decir, se tiene en cuenta el código DTD dentro de %datos_basicos;
.
Consideremos ahora que modificamos los valores de las entidades de la siguiente manera:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE persona SYSTEM "persona.dtd" [
<!ENTITY % datos_basicos "IGNORE">
<!ENTITY % datos_ampliados "INCLUDE">
]>
<persona>
<nombre>Elsa</nombre>
<edad>23</edad>
</persona>
Teniendo en cuenta que el archivo persona.dtd
sigue siendo el mismo, ambos archivos son equivalente al siguiente:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE persona SYSTEM "persona.dtd" [
<!ELEMENT persona (nombre, apellidos, edad, ciudad)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT apellidos (#PCDATA)>
<!ELEMENT edad (#PCDATA)>
<!ELEMENT ciudad (#PCDATA)>
]>
<persona>
<nombre>Elsa</nombre>
<edad>23</edad>
</persona>