El API JAXP

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 fichero DTD referenciado por esta definici�n es xhtml.dtd. Podemos copiar este fichero a nuestro sistema o modificar el identificador SYSTEM en la etiqueta <!ENTITY> para que apunte a la URL correcta.

  • Este fichero es un peque�o subconjunto de la especificaci�n XHTML, modelado despu�s del borrador XHTML Modularizado, que anima a dividir el DTD para XHTML en piezas de peque�o tama�o, que pueden combinarse para crear diferentes subconjuntos XHTML para diferentes prop�sitos. Cuando el trabajo sobre el borrador de XHTML modularizado haya finalizado, esta versi�n del DTD deber�a ser reemplazada con algo mejor. Por ahora, esta versi�n es suficiente para nuestros prop�sitos.

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.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR

SIGUIENTE ARTÍCULO