8797 sujets

Développement web côté serveur, CMS

Bonjour,

avant tout j'ignore si ce message aurait été plus à ça place dans la section XSL mais le probleme qu'il souleve ayant rapport avec l'utilisation d'une classe PHP, j'ai préféré le placer ici.

Je rencontre le probleme decris dans ce sujet à savoir que l'utilisation que la classe DOMDocument pour gènérer dynamiquement une feuille de style xsl pose probleme à la methode importStylesheet de la classe XSLTProcessor. Je penche pour une mauvaise utilisation de ma part de DOMDocument puisque l'utilisation de la fonction loadXML() ne posait pas ce probleme... Voici le bout de code que j'utilise pour générer la feuille de style XSL :
$this->xsl = new DOMDocument('1.0','utf-8');
$this->xsl->formatOutput = true;
    
$xsl = $this->xsl->createElementNS('http://www.w3.org/1999/XSL/Transform','xsl:stylesheet');
$xsl->setAttribute('version','1.0');
    
/* Variables */    
$var = $this->xsl->createElement('xsl:variable');
$var->setAttribute('name','ext');
$var->setAttribute('value',$ext);
$xsl->appendChild($var);
  
/* Output */
$output = $this->xsl->createElement('xsl:output');
$output->setAttribute('method',$ext == 'html' ? 'xml' : ($ext == 'xml' ? 'html' : $ext));
$output->setAttribute('encoding','utf-8');
$output->setAttribute('indent','no');
$output->setAttribute('omit-xml-declaration','no');
$output->setAttribute('doctype-system','http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd');
$output->setAttribute('doctype-public','-//W3C//DTD XHTML 1.0 Transitional//EN');
$xsl->appendChild($output);
    
/* Include */
$inc = $this->xsl->createElement('xsl:include');
$inc->setAttribute('href','default.xsl');
$xsl->appendChild($inc);
    
$this->xsl->appendChild($xsl);

Et voici la sortie de $this->xsl->saveXML();
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:variable name="ext" value="html"/>
  <xsl:output method="xml" encoding="utf-8" indent="no" omit-xml-declaration="no" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"/>
  <xsl:include href="default.xsl"/>
</xsl:stylesheet>

Le résultat est donc conforme à mes attentes. Mais lorsque j'importe cette feuille de style pour une une transformation XSL, la méthode importStyleSheet() me renvoit les message d'erreur suivant :

Warning: XSLTProcessor::importStylesheet() [function.XSLTProcessor-importStylesheet]: Found a top-level element xsl:variable with null namespace URI in /var/php/lib/tpl.php on line 86

Warning: XSLTProcessor::importStylesheet() [function.XSLTProcessor-importStylesheet]: Found a top-level element xsl:output with null namespace URI in /var/php/lib/tpl.php on line 86

Warning: XSLTProcessor::importStylesheet() [function.XSLTProcessor-importStylesheet]: Found a top-level element xsl:include with null namespace URI in /var/php/lib/tpl.php on line 86

Apres visite de l'url http://www.w3.org/1999/XSL/Transform, je me suis aperçu que ce schema n'etait pas encore rédigé. Je m'étonne en revanche que cette feuille de style XSL que j'utilise depuis bientot 6 mois n'ait jusqu'alors généré aucune erreure.

Ou alors la vérité est ailleurs...
Modifié par ramy (23 Jan 2008 - 21:25)
Si quelqu'un rencontre à l'avenir ce problème, voici la solution qui ma été donnée :
shangxiao a écrit :
When using the DOM api to add xsl commands to your stylesheet dynamically, be sure to use createElementNS() rather than createElement() otherwise the XSLTProcessor will not recognise these DOM nodes.

Eg: $xsl->createElementNS('http://www.w3.org/1999/XSL/Transform', 'xsl:element');