Bonjour.
J'utilise XSLT pour générer un calendrier, que j'affiche ensuite dans ma page XHTML générée "en dur". Le problème vient de l'affichage du doctype, généré par XSLTProcessor, au beau milieu de mon document XHTML, ainsi que de l'attribut xmlns ajouté à l'élément racine (ici, un <div>).

Voici la balise output utilisée dans ma feuille XSLT :
<xsl:output indent="yes" method="xml" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" encoding="UTF-8" omit-xml-declaration="yes"/>

Ici, le doctype est renseigné afin de préserver un rendu correct du code. Cependant, XSLTProcessor l'ajoute automatiquement au document généré, ce qui pose problème étant donné que je l'insère ensuite au beau milieu d'une page.

Voici le début du document généré :
<!DOCTYPE div SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<div xmlns="http://www.w3.org/1999/xhtml" id="content_calendrier">


Ce problème assez fâcheux se pose depuis un certain temps maintenant, et j'aimerais trouver le moyen de le corriger. Y a-t-il une erreur dans ma déclaration XSLT ?

Merci d'avance pour vos réponses.
Modifié par gordontesos (19 Nov 2008 - 15:57)
Salut gordontesos,

La classe XSLTProcessor te renvoie un DOMdocument.
J'imagine que actuellement tu utilise la methode saveXML() pour afficher le contenu.

Si tu passe en paramètre de cette méthode le premier noeud de ton document la déclaration XML devrait systématiquement sauté.
<?php
$root = $my_XSLT_result->firstChild
$my_XSLT_result->saveXML($root)
?>


Ensuite si j'étais toi je ne préciserait pas de Doctype.
Si le morceau de code que tu cherche à générer n'est pas un document XHTML complet (head + body, le tout dans une balise html) il ne respect pas le doctype XHTML transitional.
Ceci devrait t'éviter la présence du xmlns habituellement rajouté automatiquement par la XSLT de php sur la balise html.
(comme il ne trouve pas de balise html il rajoute le namespace sur le premier noeud du doc, ici une div).
Modifié par Citron.mecanik (17 Nov 2008 - 20:20)
Bonjour et merci de cette réponse.

Je veux bien admettre que dans mon cas, il serait plus avisé de ne pas spécifier de doctype étant donné que je ne génère pas vraiment un document XHTML correct (via DOM tout du moins), mais sans cette déclaration, le saveXML() auto-ferme tous mes éléments vides, ce qui est parfaitement correct, mais provoque un affichage complètement incohérent (mon application a un affichage assez complexe, avec beaucoup de <div> positionnés précisément, et sans le doctype, ils ont un comportement inattendu). Y a-t-il une explication logique à ce problème ?

edit : après vérification, l'attribut xmlns ne disparaît pas lorsque l'on retire la spécification du doctype. Il subsiste donc une erreur dans le document XHTML.
Modifié par gordontesos (18 Nov 2008 - 12:32)
Un explication logique j'en ai pas vraiment Smiley murf

Sinon tu peux générer un document XHTML complet (avec head body etc).
complet mais minimal, genre :

<html>
<head>
<title>titre bidon</title>
</head>
<body>
  <div id="calendar">
     ... mon calendrier HTML ...
  </div>
</body>
</html>

puis tu imprimes uniquement la partie qui t'interesse :

$calendar = $my_XSLT_result->get_element_by_id('calendar');
$my_XSLT_result->saveXML($calendar);

C'est pas très opti car tu construit un DOMDocument pour n'en imprimer qu'une partie, mais ça devrait marcher.
Modifié par Citron.mecanik (19 Nov 2008 - 12:29)
Bonjour.

J'ai finalement opté pour ta solution, à laquelle j'avais pensé mais que je voulais éviter, pour ces soucis d'optimisation. Effectivement, un document DOM est généré uniquement pour "sauter" le noeud racine, mais au moins j'ai du XHTML valide.

Merci de ton aide.