diff --git a/ecrire/inc/sax.php b/ecrire/inc/sax.php
index 085a7c7e370a6ec15d68577cca35554539f189da..c8da1967013b0866dd4d8c5003c2e2c7d9b02fbb 100644
--- a/ecrire/inc/sax.php
+++ b/ecrire/inc/sax.php
@@ -192,15 +192,19 @@ function inc_sax_dist($page, $apply=false)
 		ob_end_clean();
 	}
 
-	// charger la DTD et transcoder les entites
-	$res = $phraseur_xml->phraserTout($xml_parser, sax_bug($page));
+	// charger la DTD et transcoder les entites,
+	// et escamoter le doctype que sax mange en php 5
+	list($doctype,$page) = sax_bug($page);
+
+	$res = $phraseur_xml->phraserTout($xml_parser, $page);
 
 	xml_parser_free($xml_parser);
 
-	if ($res[0] == '<') return $res;
+	if ($res[0] == '<') return $doctype ."\n". $res;
 
 	$GLOBALS['xhtml_error'] = $res;
-	return $page;
+
+	return $doctype . $page;
 }
 
 // SAX ne dit pas si une Entite est dans un attribut ou non.
@@ -214,12 +218,14 @@ function inc_sax_dist($page, $apply=false)
 function sax_bug($data)
 {
 	global  $phraseur_xml;
+	$doctype = "";
 
 	$r = analyser_doctype($data);
 	if (!$r)
 		$data = html2unicode($data, true);
 	else  {
-		list ($topelement, $avail, $grammaire, $rotlvl) = $r;
+		list ($doctype, $topelement, $avail, $grammaire, $rotlvl) = $r;
+		$data = substr($data,strlen($doctype));
 		$file = _DIR_CACHE_XML . preg_replace('/[^\w.]/','_', $rotlvl) . '.gz';
 		if (lire_fichier($file, $r))
 			$phraseur_xml->dtc = unserialize($r);
@@ -236,7 +242,7 @@ function sax_bug($data)
 		    $trans["&$k;"] = $v;
 		$data = strtr($data, $trans);
 	}
-	return unicode2charset($data);
+	return array($doctype,unicode2charset($data));
 }
 
 // http://doc.spip.org/@analyser_doctype
@@ -245,7 +251,7 @@ function analyser_doctype($data)
 	if (!preg_match(_REGEXP_DOCTYPE, $data, $r))
 		return array();
 
-	list(,,$topelement, $avail,$suite) = $r;
+	list($doctype,,$topelement, $avail,$suite) = $r;
 
 	if (!preg_match('/^"([^"]*)"\s*(.*)$/', $suite, $r))
 		if (!preg_match("/^'([^']*)'\s*(.*)$/", $suite, $r))
@@ -261,7 +267,7 @@ function analyser_doctype($data)
 				return array();
 		$grammaire = $r[1];
 	}
-	return array($topelement, $avail, $grammaire, $rotlvl);
+	return array($doctype, $topelement, $avail, $grammaire, $rotlvl);
 }
 
 ?>
diff --git a/ecrire/public/debug.php b/ecrire/public/debug.php
index f0c18ecbc5fdb3902d466bad59b473eef27ce410..c92a0272d0e5e7f702fc59775c4430f44373b6a1 100644
--- a/ecrire/public/debug.php
+++ b/ecrire/public/debug.php
@@ -487,7 +487,7 @@ function debug_script ($t) {
 
 	debug_debut($GLOBALS['exec']);
 	if (!isset($GLOBALS['xhtml_error'])) {
-		list ($top, $avail, $grammaire, $rotlvl) = analyser_doctype($t);
+		list (,$top, $avail, $grammaire, $rotlvl) = analyser_doctype($t);
 		$err = '<h3>' . _T('spip_conforme_dtd')
 		. "<br /><a href='" 
 		. $grammaire