Ejecución de HTML & XHTML

En este artículo se describe brevemente cómo el servidor envía el XHTML al agente de usuario (por ejemplo, un navegador), y cómo los agentes de usuario comunes procesan el lenguaje de etiquetado que reciben. Se describen temas vinculados específicamente con la implementación más que estándares W3C.

Estos temas se relacionan con el material cómo declarar la codificación de caracteres de un documento HTML o XHTML. Esta información también resulta de gran utilidad para explicar por qué ciertos aspectos de estilos CSS no aparecen de la manera esperada, o varían de un agente de usuario a otro.

Tipos de MIME

Cuando el servidor ejecuta (es decir, envía) un documento al navegador, envía también cierta información adicional junto con el documento, lo que se conoce como encabezado HTTP.

En el campo Content-Type del encabezado HTTP, se describe el tipo de formato de datos. Esta información se expresa con una etiqueta para un tipo de MIME de medios. Aquí se muestra un ejemplo de encabezado HTTP para un archivo HTML donde se usa un tipo de MIME text/html. Se debe tener en cuenta que la entrada Content-Type también puede expresar la codificación de caracteres del documento.

HTTP/1.1 200 OK
Date: Wed, 05 Nov 2003 10:46:04 GMT
Server: Apache/1.3.28 (Unix) PHP/4.2.3
Content-Location: CSS2-REC.en.html
Vary: negotiate,accept-language,accept-charset
TCN: choice
P3P: policyref=http://www.w3.org/2001/05/P3P/p3p.xml
Cache-Control: max-age=21600
Expires: Wed, 05 Nov 2003 16:46:04 GMT
Last-Modified: Tue, 12 May 1998 22:18:49 GMT
ETag: "3558cac9;36f99e2b"
Accept-Ranges: bytes
Content-Length: 10734
Connection: close
Content-Type: text/html; charset=utf-8
Content-Language: en

El tipo de MIME text/html es la alternativa natural para archivos HTML. Cuando el navegador recibe un archivo con este tipo de MIME, asume que el lenguaje de etiquetado sigue la sintaxis HTML y utiliza un analizador de HTML para interpretar el significado de dicho lenguaje.

A diferencia del HTML, el XHTML es un lenguaje de etiquetado basado en XML. La sintaxis del XML es ligeramente diferente de la del HTML, y los procesadores XML son más rigurosos ante los errores. En el desarrollo de contenidos en XML, se da mucha relevancia a la validez y a la formación adecuada, y es posible una integración perfecta con todas las herramientas de procesamiento, de datos y de automatización disponibles en el mundo del XML. Muchos desarrolladores prefieren utilizar XHTML debido a las ventajas que ofrece el rigor del XML en la edición o procesamiento de documentos.

Para enviar lenguaje de etiquetado XHTML a un navegador con un tipo de MIME que indique que es XML, es necesario emplear uno de los siguientes tipos de MIME: application/xhtml+xml, application/xml o text/xml. El W3C recomienda la ejecución de XHTML como XML utilizando únicamente el primero de estos tipos de MIME, es decir, application/xhtml+xml.

Para leer XML, el navegador usa un analizador de XML, no de HTML.

Lamentablemente, hasta la versión 8 inclusive, Internet Explorer no soporta archivos ejecutados como XML, a diferencia de otros navegadores. Para dejar en claro que no todos los navegadores soportan contenidos ejecutados como XML, muchos archivos XHTML se ejecutan, en realidad, mediante el tipo de MIME text/html. En este caso, el agente de usuario leerá el archivo como si fuera HTML y utilizará el analizador de HTML.

Como el navegador considera que el XML es, en realidad, HTML, se deben tener en cuenta ciertas diferencias entre los dos formatos al escribir el código XHTML para garantizar que las variaciones de sintaxis entre XML y HTML no generen confusión en el navegador. Esto incluye las distintas formas de declarar la codificación de caracteres o las declaraciones de idioma dentro del documento.

En el Apéndice C de la especificación XHTML se recomiendan unos pocos lineamientos sobre compatibilidad para la ejecución de XHTML como HTML. Dichos lineamientos resultan particularmente importantes para versiones de navegadores más antiguas. Allí se recomienda, entre otras cosas, dejar un espacio antes de "/>" al final de una etiqueta vacía (como img, hr o br), usar el atributo lang de HTML y el atributo xml:lang de XML, y utilizar siempre tanto los atributos id como name para identificadores de fragmentos.

Modos "Standards" versus "Quirks"

Los principales navegadores actuales están preparados para mostrar un archivo HTML en modo standards o quirks. Esto significa que se aplican distintas normas para la visualización del archivo. En un caso, según la interpretación del comportamiento esperado de acuerdo con las normas W3C; en el otro caso, según el comportamiento esperado de los navegadores más antiguos que no responden a las normas actuales.

En las últimas versiones de los principales navegadores, el modo standards se activa por la presencia de una declaración DOCTYPE. La ausencia de una declaración DOCTYPE puede dar lugar a diferentes resultados de visualización de un navegador a otro.

A continuación se muestra una captura de pantalla en la que se pueden ver algunas de estas diferencias.

Imagen de la visualización del mismo archivo en modo quirks.
Visualización del documento en modo standards.
Imagen de la visualización de un archivo en modo standards.
Visualización del mismo documento en modo quirks.

Haga clic sobre las imágenes para ver las páginas HTML reales. Si las ve en Internet Explorer, observará el mismo efecto.

Ambas imágenes muestran dos páginas con exactamente el mismo etiquetado y estilo CSS, excepto por una cosa. La única diferencia respecto del original de los dos archivos es que el de la izquierda incluye una declaración DOCTYPE en la parte superior, y el otro, no. Un archivo con una declaración DOCTYPE adecuada se visualiza normalmente en modo standards en las versiones más recientes de la mayoría de los navegadores. Sin una declaración DOCTYPE, se visualiza en modo quirks.

Las diferencias visuales que se muestran arriba surgen de las siguientes variantes de implementación en un navegador como Internet Explorer:

La finalidad original de la declaración DOCTYPE es indicar la definición del lenguaje de etiquetado. A continuación se muestra el texto original con la declaración DOCTYPE incluida en la parte superior (resaltada en letra cursiva de color rojo).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="en" lang="en" xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>XHTML document</title> 
    <style type="text/css">
    body { background: white; color: black; font-family: arial, sans-serif; font-size: 12px; }
    p { font-size: 100%; }
    h1 { font-size: 16px; }
    div { margin: 20px; width: 170px; padding: 50px; border: 6px solid teal; }
    table { border: 1px solid teal; }
    </style> 
    </head> 

<body> 
    <h1>Test file for Standards/Quirks</h1> 
    <div>
        A div with CSS width:170px, margin:20px, padding:50px and border:6px.
        </div> 
    <p>Text in a p element.</p>
    <table> 
        <tr><td>Text in a table.</td></tr> 
        </table>
    </body> 
</html> 
			

Frecuentemente se dice que los navegadores que alternan de esta forma entre modos standards y quirks realizan DOCTYPE switching.

En general, se recomienda ejecutar siempre las páginas en modo standards, es decir, incluir siempre una declaración DOCTYPE.

Declaraciones XML y DOCTYPE

Existe un aspecto del uso de declaraciones DOCTYPE que reviste una importancia crítica para las declaraciones de codificación de caracteres y para la correcta aplicación de estilos.

Como XHTML 1.0 se basa en XML, es posible incorporar una declaración XML al comienzo del etiquetado, aun si se ejecuta como HTML. Entonces, la parte superior del archivo anterior se vería así (la declaración XML aparece resaltada en letra cursiva de color rojo):

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="en" lang="en" xml‎ns="http://www.w3.org/1999/xhtml">
<head>
...

En navegadores como Internet Explorer 7, Firefox, Safari, Opera, Google Chrome y otros, una página ejecutada con una declaración DOCTYPE se visualizará en modo standards, con o sin declaración XML.

Sin embargo, con Internet Explorer 6, si antes de la declaración DOCTYPE aparece cualquier marcación que no sea byte-order mark (marca de orden de bytes), la página se visualizará en modo quirks.

Si los usuarios de Internet Explorer 6 aún constituyen una porción significativa del público al que está dirigido el contenido, esto puede representar un problema. Si lo que busca es asegurarse de que sus páginas se visualicen de la misma manera que en los restantes navegadores que cumplen las normas vigentes, deberá pensar cuidadosamente cómo resolver esta cuestión.

Desde ya que esto no representa inconveniente alguno si el documento no contiene conceptos que se puedan ver afectados por las diferencias entre los modos standards y quirks. De lo contrario, deberá incorporar formas alternativas al estilo CSS para resolver dichas diferencias, o bien omitir la declaración XML.

Tenga en cuenta que si decide omitir la declaración XML, debe elegir UTF-8 o UTF-16 como método de codificación para la página. (Para más información sobre los efectos en las declaraciones de codificación, consulte Declaración de codificación de caracteres en HTML.)