Esta lección contiene explicaciones ampliadas de algunos temas que se tratan en otras lecciones. Las he incluido aquí para aligerar las otras lecciones.
Como se explica en la lección de historia de la web, el HTML no es un lenguaje de marcas único. Desde su creación en 1991, ha ido evolucionando en tres aspectos:
En las primeras versiones del HTML, el número de etiquetas (y atributos y valores de atributos) fue creciendo paulatinamente, pero manteniendo siempre la misma sintaxis y tipo MIME (text/html).
En 1997, la recomendación HTML 4 definió tres tipos de documentos (Strict, Transitional y Frameset) que mantenían la misma sintaxis y el mismo tipo MIME pero se distinguían en el número de etiquetas y atributos:
En el año 2000 el W3C desarrolló un nuevo tipo de HTML, el XHTML. En el XHTML se permitían las mismas marcas y atributos que en el HTML (se mantenían incluso los tres tipos de documentos Strict, Transitional y Frameset), pero con una sintaxis distinta (la sintaxis XHTML) y un nuevo tipo MIME, application/xhtml+xml.
Como los servidores suelen asociar el tipo MIME a la extensión de los ficheros, la costumbre es que los ficheros .html se sirvan con el tipo MIME text/html y los ficheros .xhtml se sirvan con el tipo MIME application/xhtml+xml.
La sintaxis XHTML seguía la norma XML y por tanto era más rigurosa, mientras que la sintaxis HTML era más laxa.
Nota: En la lección Diferencias entre HTML y XHTML se comentan las diferencias más importantes entre ambas sintaxis.
En el año 2000 el W3C se marcó como objetivo que el XHTML sustituyera completamente al HTML, pero en 2006, el W3C tuvo que reconocer el fracaso de ese proyecto. En mi opinión, el fracaso se debió a la combinación de dos problemas:
Es algo parecido a lo que pasaría si una persona que sólo sabe español, al entrar en una librería y pedir un libro en español, el librero cogiera ese mismo libro pero en inglés, lo envolviera y en el papel de envolver escribiera el título del libro en español y se lo vendiera al cliente. Cuando el cliente intentara leerlo, lógicamente no entendería nada.
Estos dos problemas se refuerzan mutuamente. Por un lado, muchos documentos XHTML contienen errores, pero los autores de esos documentos no son conscientes de ello porque los navegadores los muestran correctamente. En realidad los navegadores los aceptan y los muestran porque se los han servido con el tipo text/html y los navegadores están hechos para conseguir mostrar páginas con HTML con errores (que es lo que les parecen esos documentos XHTML enviados con el tipo MIME text/html). Por otro lado, como muchos documentos XHTML contiene errores, los administradores de servidores no pueden entregarlos con el tipo MIME application/xhtml+xml porque los navegadores los rechazarían por incorrectos (a partir de Internet Explorer 9, incluso Internet Explorer admite el tipo MIME application/xhtml+xml).
Una vez reconocido el fracaso, desde el año 2006 el W3C volvió a trabajar de nuevo en el HTML. En 2014 se publicó una nueva versión de HTML, el HTML 5, que aborda de una nueva manera el problema de los tipos de documentos, las variantes de sintaxis y los tipos MIME.
Con respecto a los tipos de documentos, en HTML 5 han desaparecido los tipos de documentos Strict, Frameset y Transitional y sólo existe un tipo de documento, que es una especie de mezcla de los antiguos tipos Strict y Transitional:
Con respecto a las sintaxis, en HTML 5 se mantienen las dos sintaxis, HTML y XHTML.
Con respecto a los tipos MIME, los documentos con sintaxis HTML deben utilizar el tipo MIME text/html y los documentos con sintaxis XHTML deben utilizar el tipo MIME application/xhtml+xml.
Se empezó a elaborar una solución intermedia, el llamado marcado políglota, que permitiría utilizar la sintaxis XHTML en documentos servidos con el tipo MIME text/html, pero esta solución ha sido abandonada. El último borrador de recomendación, Polyglot markup, se ha publicado en septiembre de 2015 como nota del grupo de trabajo, como suele hacer el W3C con el trabajo abandonado.
Hasta 2014/15 en estos apuntes se recomendaba y trabajaba la versión XHTML 1.0 Strict (salvo aquellos en los que es necesario utilizar la versión XHTML 1.1). Desde un punto de vista pedagógico, considero que la rigidez de la sintaxis del XHTML es una ventaja. Creo que para una persona que está aprendiendo HTML, es más fácil entender un documento XHTML sin errores sintácticos que un documento HTML con errores (aunque se muestre correctamente en un navegador). El problema era que como en este curso no utilizaba servidores de páginas web, al abrir en el navegador los ficheros directamente del disco duro (sin alojarlos en un servidor), los ficheros se cargaban como text/html. Este problema lo resolvía gracias a que editor que utilizaba en clase (Amaya) validaba continuamente el documento y los alumnos sabían si estaban creando documentos XHTML correctos.
En el curso 2014/15 empecé a trabajar el HTML 5, por lo que tuve que dejar de utilizar Amaya, que no admite HTML 5. Decidí utilizar entonces la versión XHTML 5, pero acabé descubriendo que no había sido una buena elección. El editor que empecé a utilizar entonces (Brackets) no valida los documentos por sí mismo, sino que utiliza el validador del W3C, y ese validador no permite validar XHTML 5 en archivos que no están alojados en un servidor. Los alumnos no podían validar los documentos, algo imprescindible para saber si están cometiendo errores.
En el curso 2015/16 decidí tomar una solución intermedia: trabajar HTML 5, pero incluyendo todos los elementos sintácticos del XHTML que sea posible. De esta manera, al crear documento HTML5 los alumnos podrán utilizar el validador del W3C mientras editan las páginas, pero al utilizar la sintaxis XHTML los documentos serán más fáciles de analizar y comprender.
En el curso 2018/19 he decidido abandonar la sintaxis XHTML y adoptar la sintaxis HTML (pero sin omitir las etiquetas opcionales que permite el HTML).
El problema de los tipos MIME afecta también a la validación de páginas web. La tabla siguiente detalla las posibilidades de validación de los documentos en octubre de 2014:
Se puede ... | HTML 5 (.html) |
XHTML 5 (.html) |
XHTML 5 (.xhtml) |
---|---|---|---|
... validar con W3C Validator > Upload file | No | Sí | |
... validar con W3C Validator > URI | No | Sí | |
... validar con validator.nu > File upload | No | Sí | |
... validar con validator.nu > Address | No | Sí | |
... validar con Web Developer > Local HTML (Alt+May+L, archivo local abierto como file://) |
No | No | |
... validar con Web Developer > Validate HTML (archivo en servidor) |
No | No |
Con respecto a XHTML 5, en octubre de 2014:
En el caso de páginas web de Internet (http://...), los validadores utilizaban el tipo MIME para validar como HTML (text/html) o como XHTML (application/xhtml+xml). En el caso de página web subidas manualmente al validador, los validadores utilizaban la extensión para validar como HTML (.html) o como XHTML (.xhtml)..
Los ejemplos siguientes muestran páginas web básicas de algunas variedades del HTML, comentando sus diferencias más importantes.
Los ejemplos siguientes muestran dos páginas web básicas: una página HTML 5 con sintaxis XHTML y una página HTML 5 con sintaxis HTML.
HTML 5, sintaxis XHTML, tipo MIME text/html
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8" />
<title>HTML 5</title>
<link rel="stylesheet" href="estilo.css" />
</head>
<body>
<p>Esta página es HTML 5 válido.</p>
</body>
</html>
HTML 5, sintaxis HTML, tipo MIME text/html
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8">
<title>HTML 5</title>
<link rel="stylesheet" href="estilo.css">
</head>
<body>
<p>Esta página es HTML 5 válido.
</body>
</html>
Las etiquetas que aparecen en ambos documentos son las mismas, las diferencias son simplemente sintácticas. Las diferencias entre la sintaxis HTML y la sintaxis XHTML se explican en la lección Diferencias entre HTML y XHTML.
Los ejemplos siguientes muestran dos páginas web básicas: una página HTML 5 con sintaxis XHTML y una página XHTML 5.
HTML 5, sintaxis XHTML, tipo MIME text/html
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="utf-8" />
<title>HTML 5</title>
<link rel="stylesheet" href="estilo.css" />
</head>
<body>
<p>Esta página es HTML 5 válido.</p>
</body>
</html>
XHTML 5, sintaxis XHTML, tipo MIME application/xhtml+xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html>
<html lang="es" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>XHTML 5</title>
<link rel="stylesheet" href="estilo.css" />
</head>
<body>
<p>Esta página es XHTML 5 válido.</p>
</body>
</html>
Las etiquetas que aparecen en ambos documentos son las mismas, excepto la primera línea de la página XHTML 5 y los atributos de la etiqueta html:
Los ejemplos siguientes muestran dos páginas web básicas: una página HTML 4.01 y una página XHTML 1.0.
HTML 4.01, sintaxis HTML, tipo MIME text/html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
<TITLE>HTML 4.01</TITLE>
<LINK REL="stylesheet" HREF="estilo.css">
</HEAD>
<BODY>
<P>Esta página es HTML 4.01 válido.
</BODY>
</HTML>
XHTML 1.0, sintaxis XHTML, tipo MIME application/xhtml+xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>XHTML 1.0</title>
<link rel="stylesheet" href="estilo.css" />
</head>
<body>
<p>Esta página es XHTML 1.0 válido.</p>
</body>
</html>
Las diferencias entre ambas versiones son similares a las diferencias entre HTML 5 y XHTML 5
La etiqueta <meta> que indica el juego de caracteres no es realmente una etiqueta HTML, sino una directiva pragma que equivale a la información de cabecera que enviaría el servidor al indicar el juego de caracteres.
Durante el período 1999-2006 el comportamiento de Microsoft respecto a las recomendaciones del W3C fue nefasto para el desarrollo de la web y ojalá no volvieran a repetirse situaciones similares en el futuro.
Microsoft ha formado parte del W3C desde sus inicios y ha participado en todos los grupos de trabajo, por lo que se puede suponer que todas las recomendaciones se han aprobado con su visto bueno (salvo seguramente las relacionadas con las patentes, pero ese es un tema delicado para las empresas de software propietario como Microsoft). En los primeros años del W3C, cuando el navegador más utilizado era Netscape, Microsoft sí que procuró que Internet Explorer siguiera las recomendaciones del W3C. Pero a partir de 1999, una vez que Internet Explorer se convirtió en el navegador más utilizado, Microsoft perdió el interés en seguir mejorando el navegador (y las tácticas que utilizó Microsoft para conseguir ese dominio no fueron ciertamente limpias).
Desde 1999, Microsoft jugó con la ventaja de que todos los diseñadores de páginas web tenían que asegurarse de que las páginas funcionaran correctamente en Internet Explorer.
Eso tenía dos tipos de consecuencias:
Un ejemplo, sin demasiada importancia y resuelto en IE 8, pero representativo del problema, es la etiqueta <q>. En la recomendación HTML 4.0 (aprobada en abril de 1998) establece claramente en su apartado 9.2.2 Citas, que "los agentes visuales de usuario deben asegurar que el contenido del elemento Q se muestra con comillas".
Firefox ha seguido siempre la recomendación, pero Internet Explorer no lo hacía. ¿Qué ocurría entonces? Que como la mayoría de personas que escribían páginas web desconocían las recomendaciones (lo que no decía mucho en su favor) y no probaban el resultado de sus diseños más que en Internet Explorer (lo que todavía decía menos en su favor), al utilizar la etiqueta <q> normalmente añadían también las comillas. El resultado es que los navegadores que sí seguían las recomendaciones mostraban las comillas duplicadas (las que había escrito el autor y las que deben ponerse alrededor de una etiqueta q).
El problema es que el boicoteo no se limitaba a casos anecdóticos como la etiqueta <q>, sino a aspectos mucho más importantes como el posicionamiento.
El primer tipo de problemas era importante, pero el segundo era muy grave, porque significaba que muchísimas páginas web estaban mal hechas, sin querer o a conciencia, y nunca podrían verse correctamente en navegadores que respetaran las recomendaciones del W3C.
Afortunadamente, a partir de 2005 Firefox empezó a tener una cuota de mercado significativa y a amenazar la hegemonía de Internet Explorer. Eso hizo que Microsoft tuviera que "ponerse las pilas" y publicar nuevas versiones de Internet Explorer, mejorando no solamente la interfaz del navegador (pestañas, zoom, antiphising, bloqueo de popups, etc) sino también el cumplimiento de las recomendaciones. En 2006 IE 7 supuso un avance y en 2009 IE 8 supuso un avance todavía más importante.
La aparición de Google Chrome en 2009 obligó a Microsoft a tomarse todavía más en serio las recomendaciones del W3C y en 2011 IE 9 puso a IE prácticamente a la par con los Firefox y Chrome de entonces.
Desde principios de 2011 más de la mitad de los usuarios ya utilizaban navegadores que cumplían las recomendaciones del W3C (Firefox, Chrome, Safari, Opera e Internet Explorer 9 y posteriores) y a principios de 2016 el número de usuarios ya superaba el 90% (véase la lección sobre uso de navegadores).
Aunque sin duda el problema que supuso Internet Explorer ha desaparecido, no existe la seguridad que la situación no se repita en el futuro. HTML 5, CSS 3 y la gran cantidad de APIs en desarrollo podrían dar lugar a nuevas incompatibilidades entre navegadores.
El peligro es que desde 2016 ha vuelto a haber un navegador hegemónico, Google Chrome, y empiezan a aparecer preocupantes señales de que Google está perdiendo el interés por el trabajo del W3C (como expuso Daniel Glazman en su conferencia The third browser war is over and it's a bloodshed en julio de 2016).
Esperemos que Firefox mantenga en el futuro una parte significativa del mercado y eso impida que el navegador dominante boicotee las recomendaciones. Aunque no se suele decir, quizás el principal motivo para recomendar el uso de Firefox sea contribuir así a que Google y Microsoft se vean obligados a colaborar con el W3C.