Ir directamente al contenido de esta página
Una DTD es un documento SGML que incluye las reglas sintácticas para un tipo de documento específico. Incluye los elementos que se permiten y sus atributos, así como reglas que afectan a la anidación de los primeros y a los valores de los segundos. Contrastando un documento con su DTD se puede comprobar si éste es válido o no.
La creación de una DTD está fuera del ámbito de este curso, pero si alguien quiere ver cómo es una, éste es el aspecto que presenta, por ejemplo, la DTD de XHTML 1.0 Estricto (inglés).
En lo que se refiere al desarrollo web, lo que más nos interesa es cómo indicar el tipo de documento que es un documento web, lo que se hace por medio de una línea como ésta:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
Esta declaración debe aparecer al principio del documento, sin caracter alguno anterior1, lo que incluye líneas de un lenguaje del lado del servidor, como PHP o ASP, aunque se trate de instrucciones que no escriban contenido alguno en el documento servido al cliente.
Analizada por partes, la declaración consiste en:
!DOCTYPE
: Un literal que indica al navegador que ésta es una declaración del tipo del documento.html
: Indica el elemento raíz del documento.PUBLIC
: Indica si la DTD está disponible de manera pública. Si no es así, se sustituye por SYSTEM
."-//W3C//DTD XHTML 1.1//EN"
: Éste es el Identificador Público Formal —Formal Public Identifier—. Da información sobre la propia DTD y la organización que la ha creado. Consta a su vez de varias partes separadas por dobles barras inclinadas:
-
: Este caracter indica que la organización no está registrada por ISO, como de hecho ocurre con el W3C. Si la organización sí está registrada, se sustituye por +
.W3C
: Indica la organización responsable de la DTD.DTD XHTML 1.1
: Indica el tipo de documento que se está declarando. Primero viene la Clase Pública de Texto —Public Text Class—, DTD
, y después la Descripción Pública de Texto —Public Text Description—, XHTML 1.1
. En ese afán humano por nombrar cosas, la descripción consta a su vez de otras dos partes, la etiqueta —label— que es XHTML
, y lo que en sentido estricto se denomina definición del tipo de documento, 1.1
.EN
: Es el código internacional del idioma en que esté escrita la DTD."http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
: Indica el URL de la DTD.El W3C ha definido una amplia gama de DTD (inglés), pero las que más nos interesan de cara a crear documentos XHTML son las tres variantes del 1.0:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
la de 1.1:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
y tal vez la Basic, que en teoría está pensada para definir documentos diseñados para dispositivos móviles:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.0//EN"
"http://www.w3.org/TR/xhtml-basic/xhtml-basic10.dtd">
En este curso me centraré en XHTML 1.1, puesto que es la primera versión pensada totalmente como una aplicación XML —que como lenguaje de marcado ofrece una mayor interoperabilidad—, es más estricto —lo que a largo plazo es una ventaja, creedme—, existen ya muchas páginas que son tutoriales de la versión 1.0, porque creo que prepara mejor para comprender lo que es el XHTML Modular (inglés) y también lo que será XHTML 2.0 (inglés), y porque, diga lo que diga Paul Haine en HTML Mastery, mola mucho más.
Hay otras DTD que definen un documento HTML y que no han sido desarrolladas por el W3C, como por ejemplo la de ISO, con la que se pueden crear páginas web válidas.
En teoría, al enfrentarse a un documento web un navegador podría acceder a la información contenida en la DTD, comprobar si ese documento es válido o no, y decidir entonces como tratarlo. En realidad, no ocurre así: por muy inválido que sea un documento, y por mucho que no se declare el tipo de documento del que se trata, un navegador interpretará los elementos del mismo de la mejor manera posible. ¿Qué sentido tiene, entonces, especificar la DTD?
El motivo es que los navegadores modernos tienen dos modos de interpretación:
Esta situación viene de finales de los noventa, cuando los desarrolladores de los navegadores se plantearon seguir los estándares del W3C y dejar atrás el desolador panorama provocado por la guerra entre Explorer y Netscape. El problema que se planteaban era el siguiente: si ahora nuestros navegadores interpretan correctamente los códigos, ¿qué ocurre con aquellas páginas creadas según la interpretación anterior? Pues que, obviamente, la reinterpretación de ese mismo código, que funcionaba en las versiones anteriores, aparecería plagada de «errores», porque el código sería erroneo frente al estándar.
La solución más práctica la planteó en 1998 Todd Fahrner, quien propuso que los navegadores tomaran la declaración del documento como un interruptor. Si el desarrollador de la página era un profesional preocupado por los estándares y la validez del código, desarrollaría su código siguiendo la DTD, por lo que una interpretación correcta del estándar le daría el resultado deseado. Si el desarrollador era de los otros, no habría incluido la DTD, y con el navegador interpretando el documento como hasta entonces también lograría el resultado esperado. Así, en marzo de 2000, Tantek Çelic implementó por vez primera lo que se conocería como doctype switching, en la versión 5 de Internet Explorer para Mac.
Así pues, los navegadores tratan el <!DOCTYPE>
como una mera cadena literal con la que elegir el modo en que interpretar el documento. Éste es el motivo por el que se ha planteado que en HTML5 el <!DOCTYPE>
sea algo tan sencillo como esto:
<!DOCTYPE html>
Por supuesto, no todo es tan simple. Si alguien está empleando una DTD antigua como la de HTML 4.01 Transicional, ¿lo está haciendo desde cero, o acaso está intentando actualizar, en la medida de lo posible, documentos antiguos? En ese caso, ¿cómo se debería interpretar su documento? Por cuestiones como ésta, no siempre la presencia de una declaración activa el modo estándar, y la elección depende del criterio del desarrollador del navegador. Llegados a este punto, sólo se puede investigar:
Y para terminar de sazonar la situación, Mozilla tiene un modo «Casi Estándar» (inglés), aunque apenas es relevante si se han desterrado la tablas de maquetación.
Afortunadamente, y antes de que el desámino haga mella en el desarrollador, Henri Sivonen mantiene una tabla completísima de los efectos que la declaración del tipo de documento provocan en los navegadores (inglés).
En los documentos XHTML el elemento html
presenta —o debería presentar— un aspecto como éste:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es">
El atributo xmlns
es obligatorio, y su valor es el URL indicado. ¿Qué es esto? Es el espacio de nombres.
En el elemento html
se debería especificar el idioma del documento, pero en XHTML 1.1 no se hace por medio del antiguo atributo lang
—depreciado—, sino por medio del atributo reservado de XML xml:lang
; el idioma se indica por medio de su código internacional2.
Qué sea un espacio de nombres no es fácil de explicar. Por el aspecto uno podría pensar que se trata de un documento público al estilo de una DTD, pero la verdad es que, para sorpresa de muchos de nosotros, la mayoría de los espacios de nombres no existen, en el sentido de que el URL no apunta a ninguna parte, o bien no es más que, como en el caso de XHTML, un documento en el que dice algo así como «sí, éste es el espacio de nombres» (inglés).
En realidad, el espacio de nombres no es más que un identificador que agrupa una serie de elementos pertenecientes a la misma aplicación XML, para sí hacerlos más fácilmente manejables para el software que debe interpretarlos, y también para diferenciar dos elementos que compartan el mismo nombre, pero que tengan una semántica diferente en lenguajes distintos.
Se verá más claro en el siguiente punto.
En realidad, convertir HTML en un lenguaje basado en XML tiene como objetivo poder integrarlo con otra serie de lenguajes basados en XML desarrollados en el mismo W3C, y que así un documento web sea un conglomerado de los lenguajes de marcado que sean necesarios para estructurar semánticamente su contenido.
Supongamos que tenemos un documento web que a su vez contiene información matemática. XHTML no cuenta con elementos estructurales con los que marcar ecuaciones, pero MathML sí. Sin embargo, como ambos son aplicaciones XML, su sintaxis es la misma, sólo se diferencian en los elementos y atributos que existen en cada uno de ellos. Gracias a los espacios de nombres, estos pueden identificarse y permitir la creación de documentos mixtos.
Para ello, al espacio de nombres se le asigna un prefijo que después acompaña a cada elemento y que así los diferencia. Basta con definir en el elemento raíz del documento todos aquellos espacios que se necesiten. Por ejemplo, si quisieramos crear un documento que pudiese emplear marcado XHTML, MathML y SVG, nuestro documento comenzaría con las siguientes líneas de código:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
"http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
<html xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:math="http://www.w3.org/1998/Math/MathML"
xml:lang="es">
…
Primero, indicamos una DTD que ya existe y que agrupa estos tres lenguajes de marcado, y seguidamente indicamos los espacios de nombres, especificando también los prefijos que luego precederan a cada elemento. Así, ya podríamos emplear todos los elementos de cada lenguaje, etiquetándolos de forma inequívoca:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN"
"http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd">
<html xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:math="http://www.w3.org/1998/Math/MathML"
xml:lang="es">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml" />
<meta name="language" content="es" />
<meta http-equiv="Content-Language" content="es" />
<title>Un ejemplo de documento híbridoG</title>
<link href="estilos/estilo_basico.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h1>Ejemplo de <abbr>SVG</abbr></h1>
<p>A continuación, presentamos un ejemplo de <abbr>SVG</abbr></p>
<svg:svg width="600px" height="600px">
<svg:desc>Un cuadrado y un círculo</svg:desc>
<svg:defs>
<svg:rect id="rectangulo" width="200" height="200" fill="red" x="10" y="10" stroke="black" />
<svg:circle id="circulo" r="100" cx="200" cy="200" fill="white" stroke="black" />
</svg:defs>
</svg:svg>
<h1>Ejemplo de <abbr>MathML</abbr></h1>
<p>A continuación, presentamos un ejemplo de <abbr>MathML</abbr></p>
<math:mrow>
<math:apply>
<math:eq/>
<math:ci>A</math:ci>
<math:matrix>
<math:matrixrow>
<math:ci>x</math:ci>
<math:ci>y</math:ci>
</math:matrixrow>
<math:matrixrow>
<math:ci>z</math:ci>
<math:ci>w</math:ci>
</math:matrixrow>
</math:matrix>
</math:apply>
</math:mrow>
</body>
</html>
Pero esto es el futuro. En este momento, lo importante es saber que se debe especificar el tipo de documento que se está creando, las implicaciones que tiene, y qué significa el atributo oblgatorio de html
.
Y visto todo esto, pasemos a ver las diferencias entre HTML y XHTML.
<?xml version="1.0" encoding="utf-8"?>
. Al conjunto que forman esta declaración y el <!DOCTYPE>
se llama prólogo del documento. tlh
.