diff --git a/ecrire/xml/analyser_dtd.php b/ecrire/xml/analyser_dtd.php
index 6b570e1a85f8fea735bb9c9f7f555bde80ff489d..4c114a8f780cab554f27118ec52b4fd001d511e3 100644
--- a/ecrire/xml/analyser_dtd.php
+++ b/ecrire/xml/analyser_dtd.php
@@ -25,8 +25,7 @@ function charger_dtd($grammaire, $avail, $rotlvl)
 
 	if (lire_fichier($file, $r)) {
 		if ($avail == 'SYSTEM') {
-			$src = find_in_path($grammaire);
-			if (!$src OR filemtime($file) < filemtime($src))
+			if (!$grammaire OR filemtime($file) < filemtime($grammaire))
 				$r = false;
 		}
 	}
@@ -81,10 +80,13 @@ function compilerRegle($val)
 // http://doc.spip.org/@analyser_dtd
 function analyser_dtd($loc, $avail, &$dtc)
 {
+	// creer le repertoire de cache si ce n'est fait
+	// (utile aussi pour le resultat de la compil)
+	$file = sous_repertoire(_DIR_CACHE_XML);
+	// si DTD locale, ignorer ce repertoire pour le moment
 	if ($avail == 'SYSTEM')
 	  $file = find_in_path($loc);
 	else {
-	  $file = sous_repertoire(_DIR_CACHE_XML);
 	  $file .= preg_replace('/[^\w.]/','_', $loc);
 	}
 
@@ -249,7 +251,7 @@ function analyser_dtd_entity($dtd, &$dtc, $grammaire)
 // http://doc.spip.org/@analyser_dtd_element
 function analyser_dtd_element($dtd, &$dtc, $grammaire)
 {
-	if (!preg_match('/^<!ELEMENT\s+(\S+)\s+([^>]*)>\s*(.*)$/s', $dtd, $m))
+	if (!preg_match('/^<!ELEMENT\s+([^>%\s]+)([^>]*)>\s*(.*)$/s', $dtd, $m))
 		return -3;
 
 	list(,$nom, $contenu, $dtd) = $m;
@@ -261,7 +263,7 @@ function analyser_dtd_element($dtd, &$dtc, $grammaire)
 	}
 	$filles = array();
 	$contenu = expanserEntite($contenu, $dtc->macros);
-	$val = compilerRegle($contenu);
+	$val = $contenu ? compilerRegle($contenu) : '(EMPTY )';
 	if ($val == '(EMPTY )')
 		$dtc->regles[$nom] = 'EMPTY';
 	elseif  ($val == '(ANY )') 
diff --git a/ecrire/xml/sax.php b/ecrire/xml/sax.php
index a608b489cc79239dec80e3fd8326326f91d5f048..ada8fe531adf7a876852f97d01089c640dc50868 100644
--- a/ecrire/xml/sax.php
+++ b/ecrire/xml/sax.php
@@ -248,7 +248,7 @@ function analyser_doctype($data)
 					     $pico);
 			else {
 				$dtd = $topelement . '.dtd';
-				$f = _DIR_RACINE . 'prive/' . $dtd;
+				$f = find_in_path($dtd);
 				if (file_exists($f))
 					return array('', $topelement, 'SYSTEM', $f, $dtd, $pico);
 			}