QAML es una lenguaje XML creado especialmente para ayudar en la escritura, utilizaci�n y mantenimiento de las FAQ,Frequently Asked Questions", es decir, documentos en los que se da respuesta a las preguntas m�s frecuentes sobre un tema. Su uso est�muy extendidos por Internet.
La versi�n 1.0 de la QAML fue escrita for Justin Higgens de faq.org. Pero esta versi�n est� escrita en SGML. La versi�n 2.0 ya es en XML y ha sido escrita por Rick Jelliffe del Centro de Computaci�n de la Academia Sinica de Taipei en Taiwan.
En el momento de escribir estas l�neas se encuentra en versi�n 2.4 cuya DTD pod��s encontrar en el Web sobre XML de Rick Jelliffe, que por cierto es muy interesante.
No es una sintaxis XML desarrollada por ninguna organizaci�n, pero su uso es generalizado y utilizado en muchos Webs en las que tienen que escribir FAQ. Esto nos facilita el trabajo, ya que disponemos de:
- Las XSLT que nos permiten la conversi�n a HTML.
- La CSS que nos permite visualizarla en el IE5.
- Tambi�n tenemos escrita la XSLT que nos permite convertirla a XSL-FO para luego convertirla a PDF utilizando por ejemplo el FOP de James Tauber.
- Disponemos de el html2qaml.xom,que es un Omnimark script para generar desde HTML un QAML.
- etc..
Es una de las DTD que vamos a utilizar en la elaboraci�n de nuestro Web, por lo que a continuaci�n pasamos a estudiarla en detalle.
Como podemos observar:
<!ELEMENT faq (head, body)>
faq es el elemento ra�z, que contiene una cabecera y un head.
El head se reserva para colocar informaci�n (metadata) sobre el documento:
<!ELEMENT head (title, version?, maintain+, hdr*, althdr*, archive*,label*, link*)>
Los �nicos elementos indispensables son:
- title, que es el t�tulo de la FAQ.
- maintain, que es el elemento en el que indicamos informaci�n sobre el autor o autores de la FAQ (pueden ser varios), teniendo que indicar obligatoriamente el nombre y el corr�o electr�nico del autor.
<!ELEMENT maintain (logo*, name+, email+, subject?, address?)>
En el elemento body escribimos el contenido del cuerpo (conjunto de preguntas y respuestas):
<!ELEMENT body (section+ | qna+)>
La funcionalidad del elemento section es la de permitir agrupar los elementos qna en conjuntos:
<!ELEMENT section (logo*, title, (qna+ | q+ | ( p | div | section)+)) >
Es obligatorio que empiece por un t�tulo.
El elemento qna es sin duda el m�s importante de esta DTD, ya que contiene la pregunta y sus respectivas respuestas.
<!ELEMENT qna (logo*, q, (logo?,topic?,author?,contributor*,a)+)>
Es obligatoria la pregunta, representada por el elemento q y la respuesta indicada en el elemento a.
Como podemos observar, las respuestas pueden ser varias: (....a)+ y pueden estar acompa�adas de informaci�n adicional: autor, contributor, etc.
El elemento qna puede tener los siguientes atributos:
<!ATTLIST qna id ID #IMPLIED class CDATA #IMPLIED xml:lang NMTOKEN #IMPLIED date CDATA #IMPLIED>
ninguno de ellos obligatorio (todos son #IMPLIED) aunque algunos muy recomendables como es el id, que nos permite identificar de forma un�voca una qna.
Una pregunta (elemento q) est� formada esencialmente por texto (#PCDATA):
<!ELEMENT q (#PCDATA | link | span)*>
Una respuesta (elemento a) tiene que estar formada
<!ELEMENT a (p | div)+>
al menos por un elemento p o elemento div.
Por tanto, un ejemplo de XML m�nimo que se ajuste a esta DTD es:
<?xml version="1.0"?> <!DOCTYPE faq SYSTEM "qaml.dtd"> <faq> <head> <title>Mi primer FAQ con la QAML.dtd</title> <maintain> <name>Joaquin Bravo</name> <email>[email protected]</email> </maintain> </head> <body> <qna id='q1'> <q>Aqui la pregunta</q> <a><p>Aqui la respuesta.</p></a> </qna> </body> </faq>
Mediante el elemento p indicamos bloques de contenido. Tenemos que tener cuidado y no confundirlo con un simple p�rrafo, ya que el atributo class nos permite especificar un poco m�s las caracter�sticas de su contenido.
<!ATTLIST p id ID #IMPLIED class CDATA #IMPLIED title CDATA #IMPLIED xml:lang NMTOKEN #IMPLIED alt CDATA #IMPLIED date CDATA #IMPLIED xml:space ( default | preserve ) #IMPLIED >
Como podemos ver no es obligatorio, y tampoco tiene ning�n valor por defecto, es decir podemos poner el valor que queramos, y luego manipularlo de una manera u otra desde la aplicaci�n u hoja de estilos.
La autora de la DTD, cuando por ejemplo est� introduciendo un contenido que quiere que forme parte de una lista, da el valor li al atributo class.
<p class="li">AAAA</p> <p class="li">BBBB</p>
Es una forma de trabajar que presenta ventajas e inconvenientes:
- Permite que los documentos XML sean bastantes flexibles aunque tengan una DTD a la que ajustarse.
- Pero tambi�n dificulta la reutilizaci�n de documentos XML, XSLT, etc.realizados por otras personas, ya que a priori no sabemos los valores que utilizan para el atributo class. Y m�s si tenemos en cuenta que este atributo se utiliza en varios elementos.
Adem�s de este atributo, como podemos observar el elemento p, posee m�s atributos que lo caracterizan:
- id, mediante el cual lo podemos identificar de forma un�voca. Este atributo se utiliza en pr�cticamente todos los elementos.
- title, que permite asociar un t�tulo a ese contenido.
- xml:lang, mediante el cual podemos identificar el idioma en el que est� escrito.
- alt, que permite asociar texto adicional sobre el contenido del p�rrafo.
- date, que permite escribir la fecha cuando fue colocado.
- xml:space, que indica c�mo deberemos tratar los espacios en blanco que se encuentran dentro del contenido.
Los elementos p se pueden agrupar mediante el elemento div.
<!ELEMENT div (p)+>
el cual debe estar formado por al menos un p�rrafo. Lo podemos utilizar por ejemplo para crear listas ordenadas o desordenadas, tal como muestra el siguiente ejemplo:
<div class="ul"> <p class="li">AAAA</p> <p class="li">BBBB</p> </div>
d�ndo al atributo class el valor ul. Si quisi�ramos que fuese ordenada, le pondr�amos el valor ol.
El contenido del elemento p es generalmente texto:
<!ELEMENT p (#PCDATA | link | span)*>
aunque, al igual que el elemento pregunta q, tambi�n puede llevar los elementos link y span.
Mediante el elemento link colocamos enlaces. Su contenido s�lo puede ser texto:
<!ELEMENT link (#PCDATA)>
y la direcci�n del enlace se coloca en el atributo href.
<!ATTLIST link id ID #IMPLIED class CDATA #IMPLIED xml:link CDATA #FIXED "simple" href CDATA #REQUIRED alt CDATA #IMPLIED role CDATA #IMPLIED title CDATA #IMPLIED show (embed|replace|new) "new" actuate (auto|user) "user" behavior CDATA #IMPLIED>
que como podemos observar es el �nico obligatorio (#REQUIERED).
Por tanto, un enlace tendr�a escrito en XML el siguiente aspecto:
<link href="http://www.altavista.com">altavista.</link>
Como podemos observar, tiene muchos m�s atributos, entre ellos el superutilizado class, pero dejaremos el estudio de estos atributos para m�s adelante ya que est�n muy relacionados con la especificaci�n XLink en la que se define c�mo tienen que ser los enlaces entre documentos XML.
Y, por �ltimo, mediante el elemento span caracterizamos partes del contenido dentro del elemento p. Su atributo m�s importante es el classcon el que podemos indicar que si el texto est� cursiva poni�ndole el valor i.
<span class="i">texto en cursiva</span>
Sin embargo debemos tener claro que este texto aparecer� en cursiva porque luego la aplicaci�n o XSLT que lo trate lo representar� como tal. La verdad es que luego, cuando nosotros lo pintemos, podremos ponerlo como m�s nos guste. Los valores que normalmente utiliza la autora de la DTD en sus ejemplos est�n enfocados a la presentaci�n y muy relacionados con el HTML y las CSS, pero nosotros, si queremos, podemos ponerle valores que identifiquen m�s categ�ricamente (sem�nticamente) el contenido de lo que califica. Por ejemplo, en lugar de i podr�amos poner el valor codigo.
Todav�a falta por describir algunos elementos y atributos, pero dejo como ejercicio estudiar con m�s detalle la DTD.Aunque con lo que se ha presentado hasta ahora, deben quedar claros la utilidad y el funcionamiento de esta DTD.
�Ejercicio: FAQ en XML
Escribir una FAQ en XML sobre el tema seleccionado.
Soluci�n:
Para el Web de WML en castellano encontrar�is un FAQ sobre WAP.
El documento en formato XML pod�is obtenerlo aqu�.