Igual que las entidades generales nos permiten reutilizar datos XML en varios lugares, una entidad de par�metro nos permite reutilizar partes de un DTD en varios lugares. Tambi�n veremos como usar entidades de par�metro con secciones condicionales en un DTD.
�Crear y Referenciar una Entidad de Par�metro
Recuerda que la versi�n existente de la presentaci�n de diapositivas no pudo ser validada porque el documento usaba etiquetas <em>, y �stas no eran parte del DTD. En general, nos gustar�a usar una variedad completa del estilo HTML en el texto de un slide, no s�lo una o dos, por eso tiene m�s sentido usar un DTD existente para XHTML que define todas las etiquetas que podriamos necesitar siempre. Una entidad de par�metro est� dise�ada para este prop�sito.
|
Nota:
El XML mostrado aqu� est� en slideshow2.dtd. El fichero XML que referencia es slideSample08.xml. |
Abrimos nuestro fichero DTD para la presentaci�n y a�adimos el texto en negrita de abajo para definir una entidad de par�metro que referencia un fichero DTD externo:
<!ELEMENT slide (image?, title?, item*)>
<!ATTLIST slide
...
>
<!ENTITY % xhtml SYSTEM "xhtml.dtd">
%xhtml;
<!ELEMENT title ...
Aqu�, usamos una etiqueta <!ENTITY> para defiir una entidad de par�metro, igual que para una entidad general, pero usando una s�ntaxis algo diferente. Hemos incluido un signo de tanto por ciento (%) antes del nombre de entidad cuando definimos la entidad, y hemos usado el signo de tanto por ciento en lugar del ampersand cuando lo referenciamos.
Tambi�n, observamos que hay siempre dos pasos para usar una entidad de par�metro. Lo primero es definir el nombre de la entidad. Lo segundo es referenciar el nombre de la entidad, lo que realmente hace el trabajo de incluir la definici�n externa en el DTD actual. Como la URI para una entidad externa puede contener barras inclinadas (/) u otros caracteres que no son v�lidos en un nombre XML, el paso de la definici�n permite que un nombre v�lido XML sea asociado con un documento real. (Esta es la misma t�cnica usada en la definici�n de espacios de nombres, y en cualquier otro lugar que los constructores XML necesiten referenciar documentos externos.)
Notas:
|
El punto bueno de usar un DTD basado en XHTML era obtener el acceso a una entidad definida que cubre etiquetas de estilo HTML como <em> y <b>.
<!ENTITY % inline "#PCDATA|em|b|a|img|br">
Esta entidad es un sencilla versi�n de aquellas denidas en el borrador XHTML Modularizado. Define etiquetas del estilo HTML que son las que queremos usar -- enfasis, negrita, y un par de ellas para im�genes y enlaces que podr�amos usar o no en una presentaci�n de diapositivas. Para usar la entidad inline, hacemos los cambios en negrita de abajo en nuestro DTD:
<!ELEMENT title (#PCDATA %inline;)*> <!ELEMENT item (#PCDATA %inline; | item)* >
Estos cambios reemplazan el �tem #PCDATA con la entidad inline. Es importante observar que #PCDATA est� primero en la entidad inline, y que inline esta primero siempre que lo usamos. Esto es necesario por la definici�n XML de un modelo de contenido mixto. Para estar de acuerdo con este modelo, tambi�n tuvimos que a�adir un asterisco al final de la definici�n title. (En las dos siguientes secciones, veremos que nuestra definici�n del elemento title realmente crea conflictos con una versi�n definida en xhtml.dtd, y veremos diferentes formas de resolver el problema).
|
Nota:
El DTD XHTML Modularizado define ambas entidades inline e Inline, y hace algo de forma diferente. En vez de especificar #PCDATA|em|b|a|img|br, sus definiciones son algo m�s como (#PCDATA|em|b|a|img|br)*. Usando una de estas definiciones, por lo tanto, se parece algo m�s a esto: <!ELEMENT title %Inline; > |
�Secciones Condicionales
Antes de proceder con el siguiente ejercicio de programaci�n, merece la pena mencionar el uso de entidades de par�metro para controlar secciones condicionales. Aunque no podemos condicionar el contenido de un documento XML, podemos definir secciones condicionales en un DTD que ser�n parte del DTD s�lo si especificamos include. Por otro lado, si especificamos ignore, la secci�n condicional no ser� incluida.
Supongamos, por ejemplo, que queremos usar versiones ligeramente diferentes de un DTD, dependiendo de si estamos tratando el documento como un documento XML o un documento SGML. Podr�amos hacer esto con definiciones DTD como estas:
someExternal.dtd:
<![ INCLUDE [
... XML-only definitions
]]>
<![ IGNORE [
... SGML-only definitions
]]>
... common definitions
Las secciones condicionales se presentan mediante "<![", seguidas por la palabra clave INCLUDE o IGNORE y otro "[". Despu�s de esto viene el contenido de la secci�n condicional, seguido por el terminador: "]]>". En este caso, las definiciones XML son incluidas y las definiciones SGML son excluidas. Esto est� bien para documentos XML, pero no podemos usar DTD para documentos SGML. Por su puesto, podr�amos cambiar las palabras clave, pero esto s�lo invertir�a el problema.
La soluci�n es usar referencias a entidades de par�metro en lugar de las palabras clave INCLUDE e IGNORE:
someExternal.dtd:
<![ %XML; [
... XML-only definitions
]]>
<![ %SGML; [
... SGML-only definitions
]]>
... common definitions
Luego, cada documento que use el DTD puede configurar las definiciones de entidad apropiadas:
<!DOCTYPE foo SYSTEM "someExternal.dtd" [
<!ENTITY % XML "INCLUDE" >
<!ENTITY % SGML "IGNORE" >
]>
<foo>
...
</foo>
Este procedimiento da a cada documento el control del DTD. Tambi�n reemplaza las palabras clave INCLUDE e IGNORE con nombres de variables que reflejan de forma m�s segura el prop�sito de la secci�n condicional, produciendo una versi�n del DTD m�s le�ble y auto-documentada.