J'avais dans l'idée de tester l'utilisation de transformation XSLT par Javascript pour ensuite injecter le résultat dans le document en cours. J'ai demandé conseil à mon pote Google, qui m'a redirigé vers les 537 copies du même article dont les exemples ne marchent pas. Donc j'ai demandé à mon autre pote, Mozilla Developer Center pour tout reprendre à zéro, mais là encore sans succès.
J'ai essayé de réduire le problème à sa plus simple expression, et d'après ma relativement faible connaissance de la manipulation de XML en JS, il semblerait que le fragment de DOM que je génère soit vide (XMLSerializer me renvoit une chaîne vide que je serialize() mon XML, XSL ou le fragment généré). Firebug ne me renvoit aucun warning, aucune erreur, donc j'arrive à cours de pistes à explorer.
Voici mes fichiers de test. Dans l'exemple, on utilise un arbre XML vide, et un fichier XSL qui sort un paragraphe avec "Hello World". Le Javascript est sensé tranformer le XML et insérer le résultat dans le div #target. Pour info j'ai essayé de remplacer le xsl:output pour sortir du XML sans doctype, sans succès. D'après XMLSerializer, xml est vide, xsl est vide... et pourtant si j'ajoute volontairement des erreurs dans les fichiers elles apparaissent dans Firebug, donc les fichiers sont bien chargés.
xslt.html
Code : Tout sélectionner
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="xslt.js" />
</head>
<body>
<div id="target" />
</body>
</html>Code : Tout sélectionner
window.onload = function ()
{
var xsl = document.implementation.createDocument("", "", null);
xsl.load('xslt.xsl');
var xml = document.implementation.createDocument("", "", null);
xml.load('xslt.xml');
var xslt = new XSLTProcessor()
xslt.importStylesheet(xsl);
var frag = xslt.transformToFragment(xml, document);
document.getElementById('target').appendChild(frag);
}Code : Tout sélectionner
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="xslt.xsl" ?>
<root />Code : Tout sélectionner
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" />
<xsl:template match="/">
<p>Hello World</p>
</xsl:template>
</xsl:stylesheet>Edit: OMG, j'ai fait un dernier coup de Google à tout hasard, et en utilisant XHR pour charger les fichiers en question ça fonctionne. Cool, j'ai juste passé 2h à faire un Hello World
xslt.js
Code : Tout sélectionner
window.onload = function ()
{
var xsltProcessor = new XSLTProcessor();
var myXMLHTTPRequest = new XMLHttpRequest();
myXMLHTTPRequest.open("GET", "xslt.xsl", false);
myXMLHTTPRequest.send(null);
xslStylesheet = myXMLHTTPRequest.responseXML;
xsltProcessor.importStylesheet(xslStylesheet);
myXMLHTTPRequest = new XMLHttpRequest();
myXMLHTTPRequest.open("GET", "xslt.xml", false);
myXMLHTTPRequest.send(null);
var xmlSource = myXMLHTTPRequest.responseXML;
var resultDocument = xsltProcessor.transformToFragment(xmlSource, document);
document.getElementById("target").appendChild(resultDocument);
}