Bonjour, je bosse en PHP 5.
mon but est d'appliquer une transformation XSL (lue à partir d'un fichier puis un peu modifiée) à un DOMDocument XML.
Code :
- // Chargement du document XML
- $xml = new DOMDocument;
- $xml->load('document.xml');
- // Chargement de la transformation originale (transfo1)
- $xsl = new DOMDocument;
- $xsl->load('transfo1.xsl');
- // Transformation !
- $proc = new XSLTProcessor;
- $proc->importStyleSheet($xsl);
- echo $proc->transformToXML($xml);
|
Jusque là ça marche, pas de soucis...
Mon problème est que je veux rajouter une deuxième transformation au document, qui provient d'un fichier différent, en fonction d'une variable PHP.
Si $deuxieme_xsl = 'transfoA.xsl' , il faudra rajouter la transformation transfoA en plus de transfo1.
Si $deuxieme_xsl = 'transfoB.xsl' , il faudra rajouter la transformation transfoB en plus de transfo1.
etc...
Apparemment XSLTProcessor ne peut charger qu'une feuille de style, on doit donc passer par une importation dans la première feuille de style. Il faut donc rajouter ça à transfo1 :
Code :
- <xsl:import href="transfoA.xsl"/>
|
(avec transfoA pour exemple, mais ce nom de fichier est variable).
Je rapelle que c'est une directive top-level qui doit être directement à la suite de
Code :
- <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
|
1ère tentative : faire un appel PHP dans la feuille de style transfo1.xsl
Code :
- <xsl:import href="<xsl:value-of select="php:function('deuxieme_xsl')"/>"/>
|
Evidemment il est interdit d'imbriquer deux directives de la sorte.. Donc ça ne marche pas.
2ème tentative : modifier le DOM de transfo1.xsl
Sachant que la première balise est xsl: output , je fais en sorte de rajouter xsl:import juste avant :
Code :
- // nouvel élément xsl:import
- $import = $xsl->createElement('xsl:import');
- // on repère l'élément xsl:output (j'ai vérifié, il ne faut pas mettre le "xsl:" devant dans getElementsByTagName)
- $output = $xsl->getElementsByTagName('output')->item(0);
- // on insère xsl:import juste avant
- $import = $xsl->documentElement->insertBefore($import, $output);
- // on rajoute l'attribut href qui pointe vers la secodne transformation variable
- $import->setAttribute('href', $deuxieme_xsl);
|
A première vue le résultat paraît parfait, voici l'affichage string du DOMDocument $xsl de transfo1 ainsi modifié :
Code :
- <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
- <xsl:import href="transfo2.xsl"/><xsl:output etc...
|
Malheureusement, une erreur se produit ensuite sur XSLTProcessor::importStyleSheet :
Code :
- Warning: Found a top-level element xsl:import with null namespace URI
|
3ème tentative : pareil, en jouant avec les namespaces
Voici le nouveau code PHP :
Code :
- // nouvel élément xsl:import
- $import = $xsl->createElementNS('xsl', 'import');
- // on repère l'élément xsl:output
- $output = $xsl->getElementsByTagName('output')->item(0);
- // on insère xsl:import juste avant
- $import = $xsl->documentElement->insertBefore($import, $output);
- // on rajoute l'attribut href qui pointe vers la secodne transformation variable
- $import->setAttribute('href', $deuxieme_xsl);
|
Voici l'affichage string du DOMDocument $xsl de transfo1 ainsi modifié :
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<import xmlns="xsl" href="transfo2.xsl"/><xsl:output etc... |
le xsl:import n'a pas la forme escomptée, mais XSLTProcessor::importStyleSheet ne génère plus d'erreur.
En revanche, la deuxième transformation n'est pas effectuée Le XSLTProcessor ignore l'importation ...
Voilà, je suis à bout de souffle, j'en fais appel à vous ! Merci d'avance
Message édité par Chase le 18-05-2005 à 23:46:06