XHTML 1.1 valide ?
Avant propos : Je rajoute ce paragraphe après coup pour clarifier un état d'esprit qui n'était peut-être pas évident. Des articles ou autres blogs me permettent parfois de réagir et je me lance dans des réponses, parfois très (trop) critiques. Il ne s'agit pourtant généralement pas de reproche (ou alors c'est clairement visible), mais simplement pour moi de profiter d'un sujet pour donner des opinions auxquelles je tiens. Cet article est dans cet état d'esprit, absolument pas dans une optique négative à l'encontre d'un auteur que je lis régulièrement.
« Oui mais non »
, c'est la réponse que je ferai à
l'article de Genezys
« XHTML 1.1
valid ? »
(Note: le billet a depuis été effacé, il datait du 21 mai 2003). Il rappelle que même si une page est valide d'après les
spécifications XHTML 1.1 elle peut être interprétée en HTML et non XHTML.
La solution de Genezys
La solution adoptée se base sur le code suivant, il s'agit
d'une analyse de la requête HTTP en vue de déterminer si
le navigateur comprend les documents envoyés avec le type de média application/xhtml+xml :
if (strstr($_SERVER['HTTP_ACCEPT'],'application/xhtml+xml')){
header("Content-type: application/xhtml+xml");
echo "<?xml version='1.0' encoding='iso-8859-15'?>\n";
} else {
header("Content-type: text/html; charset=iso-8859-15");
}
Mauvaise solution…
Oui mais non, car en aucun cas du XHTML 1.1 ne devrait
être envoyé avec un type de média text/html. La note du W3C sur les types de
média XHTML clarifie ce point et exprime complètement ce qui
doit être fait, entre autre que le XHTML 1.1 ne devrait pas être
envoyé en text/html,
seul le XHTML 1.0 le peut. Et encore, le peut
est un
terme fort car il ne s'agit d'un type de média à usage exclusif
des anciens navigateurs, à certaines conditions, juste toléré par
une
appendice non normative. Voilà ce que dit la norme, donc déjà
cette procédure sort explicitement de ce que demande le W3C.
Maintenant il y a d'autres raisons de ne pas utiliser du
XHTML en text/html,
j'en avais résumé certaines dans un article nommé XHTML ? non, HTML !
,
le 18 avril. Parmis ces raisons on trouve en bonne position le
fait de tromper le client sur le contenu car contrairement à l'idée
répandue, le
XHTML n'est pas compatible avec le HTML :
l'affichage correct du XHTML en text/html se base uniquement sur un bug répandu de
nos navigateur. Ce qui réduit fortement l'interopérabilité avec un
éventuel client respectant totalement la norme mais n'ayant pas le
bug.
…changer de solution
Il y a trois solutions possibles pour revenir à une situation acceptable :
- Passer en XHTML 1.0. Ça n'est pas parfait car on reste
à la limite des normes, dans une tolérance pour compatibilité. Solution
que personnellement je refuse car elle amène de nouvelles
incompatibilités ; mais au moins on reste dans le cadre des
lignes de conduites de la publication XHTML. Tout document
XHTML 1.1 étant aussi un document XHTML 1.0 valide, rester
en 1.1 en
text/htmltient des symptômes d'une versionnite aiguë assez radicale (les explications sur ce que je veux dire par là sont trouvables dans mon article précédent sur XHTML et HTML). - Passer en HTML 4.01. Ça peut paraître rétrograde mais c'est une solution qui répond à tous les problèmes. Je fais une publication pour être lu, ce format m'assure la réception la meilleure, je ne vois pas pourquoi je ne le choisirai pas.
- Faire toujours une détection de fonctionnalité grâce aux entêtes de la requête HTTP, mais en cas d'absence de support XHTML, au lieu de changer simplement d'entête, changer directement de format et envoyer du HTML. Mieux, toujours en lisant la même entête il est possible de lire les préférences de l'utilisateur en terme de format, et donc d'agir plus loin que le simple supporté ou pas.
Et là je vois venir deux types d'arguments contre mes deux dernières solutions :
- Toute la gestion est XML donc je dois faire du XHTML et pas du HTML
- Supporter deux formats est complexe
Ce à quoi je répond que non, Genezys étant fait à base de XML, il suffit de rajouter une balise dans son fichier XSLT pour que le format de sortie soit du HTML complètement valide et plus du XHTML :
<xsl:output method="html" version="1.0" encoding="ISO-8859-1"
doctype-public="-//W3C//DTD HTML 4.0//EN"
doctype-system="http://www.w3.org/TR/REC-html40/strict.dtd"
media-type="text/html" indent="yes" omit-xml-declaration="no" />
Il suffirait alors de choisir la bonne feuille XSLT en fonction de ce que demande le navigateur. Je sais que c'est possible, c'est ce que je faisais il y a quelques mois. J'ai arrêté car je ne voyais pas l'intérêt de maintenir le XHTML à l'heure actuelle, mais ça c'est un choix personnel, pas une contrainte technique.
Autres détails
Il reste tout de même deux détails que je souhaite aborder sur les six lignes de code PHP de Genezys :
Tout d'abord faire des tris par la requête HTTP est bien la
bonne solution. Je trouve même dommage que les navigateurs ne profitent
pas même totalement de cette fonctionnalité en envoyant les versions
supportés, les sous formats (quelle version de XHTML ?) et tout
autre information utile. Et là je ne parle pas de MSIE qui affirme
recevoir */*
et ne s'embête pas avec la suite.
Je suis étonné que dans le cas du XHTML le jeu de caractère ne soit pas déclaré aussi (en plus du prologue XML) dans la déclaration HTTP du type de média, comme pour le HTML. Pourtant la même note que tout à l'heure indique que spécifier le jeu de caractère dans le protocole de plus haut niveau est très fortement recommandée. Quel intérêt de ne pas le mettre ?
Vous pouvez trouver plus d'informations sur les types de média via mon article du 8 avril 2003.

