Ir directamente al contenido de esta página

codexexempla.org

DTD y espacios de nombres

Tabla de contenidos

  1. ¿Qué es una DTD?
  2. El sentido de la DTD: el modo estándar y el modo quirks de los navegadores
  3. ¿Qué es un espacio de nombres?
  4. El sentido de los espacios de nombres: XHTML como anfitrión

¿Qué es una DTD?

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:

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.

El sentido de la DTD: el modo estándar y el modo quirks de los navegadores

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).

¿Qué es un espacio de nombres?

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.

El sentido de los espacios de nombres: XHTML como anfitrión

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.

Notas

  1. Sólo hay una excepción, y se da cuando el documento XHTML se sirve realmente como XML. En este caso, debe incluir antes la declaración de XML, <?xml version="1.0" encoding="utf-8"?>. Al conjunto que forman esta declaración y el <!DOCTYPE> se llama prólogo del documento. Volver
  2. La lista completa de códigos internacionales de idiomas se especifica en las ISO 639-1 e ISO 639-2 (inglés). Como detalle anecdótico, aquí se puede comprobar que el klingon está reconocido como idioma, y que su código es tlh. Volver

Contacto

En virtud de la Ley Orgánica 15/1999 de Protección de Datos de Carácter Personal le informo de que los datos que proporcione no serán empleados para otro fin que el de responder a su mensaje. En especial, me comprometo a no cederlos a terceros ni a emplearlos para enviar información no solicitada.

Del blog de Digital Icon