Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# pb chargement XML et XSLT

Envoyé par : Utilisateur anonyme

Date : 08/04/2005 17:30

Je n'arrive à faire marcher ce code Javascript:

function toto()
     {
       var objXSL;
       var objXML;
       var xsltProcessor; 
function xslLoad()
{
         alert("xsl "+objXSL);
  xsltProcessor.importStylesheet(objXSL);
}
function xmlLoad()
{
         alert("xml "+objXML);
        /* var install = document.evaluate("/trot", objXML, null, XPathResult.ANY_TYPE,null);
         window.alert(install.iterateNext().textContent);*/
  var domdoc = xsltProcessor.transformToDocument(objXML,document);
  var xmls = new XMLSerializer();
  //document.write(xmls.serializeToString(domdoc));
         alert(xmls.serializeToString(domdoc));
}
       xsltProcessor = new XSLTProcessor();
       objXSL = document.implementation.createDocument("", "", null);
       objXSL.load("test.xsl");
       objXSL.onload=xslLoad();
       objXML = document.implementation.createDocument("", "", null);
       objXML.load("test.xml");
       objXML.onload=xmlLoad();
       /*var objXSLHTTP = new XMLHttpRequest();
       objXSLHTTP.open("GET", "test2.xsl", false);
       objXSLHTTP.send(null);
       objXSL = objXSLHTTP.responseXML;
       xslLoad();
       var objXMLHTTP = new XMLHttpRequest();
       objXMLHTTP.open("GET", "test2.xml", false);
       objXMLHTTP.send(null);
       objXML = objXMLHTTP.responseXML;
       xmlLoad();*/
    }

Il prend un xsl appellé test2.xsl et un xml test2.xml et fait la transformation et l'affiche dans un alert.

Je l'appelle depuis l'évènement onClick d'un XUL ou onload d'un HTML. Tous ceci ce trouve dans un content d'un répertoire chrome de mozilla (les XUL de ce répertoire fonctionnent correctement).

Les évaluation Xpath sur le HTML ne marche pas non plus et la console javascript n'envoie pas d'erreur avec ce code.

Par contre en mettant ce js sur un serveur http et en activant le code en commentaire ca fonctionne.

Merci d'avance

# Re: pb chargement XML et XSLT

Envoyé par : laurentj

Date : 09/04/2005 10:55

certainement du au fait qu'en local, Mozilla n'obtient pas le type mime du fichier xsl, donc ne reconnait pas qu'il s'agisse de xsl, donc l'ignore.

# Re: pb chargement XML et XSLT

Envoyé par : Cheub

Date : 28/06/2006 11:46

Salut,

Je resors les vieux dossiers... J'ai le même problème, et mon appli (déclarée en chrome) est destinée à s'éxécuter en local. Y'a-t-il un moyen de contourner ce problème? Quelqu'un aurait-il un bout de code montrant comment effectuer une transformation XSLT sur un fichier XML (le but ici étant de générer du XUL).

Merci d'avance

# Re: pb chargement XML et XSLT

Envoyé par : thefab

Date : 28/06/2006 13:03

Si le problème viens bien du type mime manquant tu peux le forcer avec overrideMimeType

# Re: pb chargement XML et XSLT

Envoyé par : ballinette

Date : 28/06/2006 15:19

J'avais rencontré récemmment le même soucis, que j'ai résolu en recréant un inputstream à partir du fichier XSLT (y a peut-être plus simple, auquel cas je suis preneur) :

J'ai en fait créé une fonction chromeInputStream() qui prend comme argument un nom de fichier (en fait le chemin d'accès depuis le répertoire chrome) et retourne un objet file-input-stream contenant le flux correspondant :

 function osWindows() {
 // Cette fonction retourne un booléen indiquant si on est en
 // environnement Windows ou non (utile pour construire les filepath
 // avec les bons caractères de séparation de fichier).
   return ((navigator.platform.substring(0,3) == "win") || (navigator.platform.substring(0,3) == "Win"));
 }
function chromeInputStream(filepath) {
 /**/
 // Récupération de l'uri d'accès au contenu de
 // "chrome://<monappli>/content", qui contient mon fichier xslt :
 var ios = Components.classes["@mozilla.org/network/io-service;1"].
         getService(Components.interfaces.nsIIOService);
  var ch_ec = ios.newURI("chrome://<monappli>/content", null, null);
 var chs = Components.classes["@mozilla.org/chrome/chrome-registry;1"].
         getService(Components.interfaces.nsIChromeRegistry)
 var uri = decodeNSURI(chs.convertChromeURL(ch_ec).path);
 /**/
 var debut = 0;
 if (uri.lastIndexOf("file://") > -1) {
   debut = uri.lastIndexOf("file://") + 7;
 } // ici, debut est l'indice du premier caractère utile de l'uri.
 /**/
 // Initialisation du FileInputStream qui sera retourné par la fonction :
 var is = Components.classes["@mozilla.org/network/file-input-stream;1"]
     .createInstance(Components.interfaces.nsIFileInputStream);
 /**/
 if (uri.lastIndexOf('!') > 0) {
   // Si on est dans un fichier JAR (cas général pour les xpi déployés), on contruit l'inputstream de retour
   // en ouvrant le .jar avec un objet zipreader :
   var jar = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
   var urizip = uri.substring(debut, uri.lastIndexOf('!'));
   if (osWindows()) {
     // Si on est sous windows, on remplace tous les / par des \ dans le chemin d'accès au fichier .jar
     while (urizip[0] == "/") {
       urizip = urizip.substring(1,urizip.length);
     }
     while(urizip.lastIndexOf("/") > -1) {
       urizip = urizip.replace("/","\\");
     }
   }
   //ouverture du fichier .jar :
   jar.initWithPath(urizip); 
   var zipreader = Components.classes["@mozilla.org/libjar/zip-reader;1"]
       .createInstance(Components.interfaces.nsIZipReader);
   zipreader.init(jar);
   var filepathtotal = uri.substring(uri.lastIndexOf('!')+2,uri.lastIndexOf("/")+1) + filepath;
   zipreader.open();
   // création de l'objet InputStream à partir du bon contenu :
   is = zipreader.getInputStream(filepathtotal);
 /**/
 } else {
   // si on n'est pas dans un fichier JAR (cas typique d'une phase de développement),
   // on accède directement au fichier :
   var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
   var filepathtotal = uri.substring(debut, uri.lastIndexOf("/")+1) + filepath;
   if (osWindows()) {
     while (filepathtotal[0] == "/") {
       filepathtotal =  filepathtotal.substring(1,filepathtotal.length);
     }
     while(filepathtotal.lastIndexOf("/") > -1) {
       filepathtotal = filepathtotal.replace("/","\\");
     }
   }
   file.initWithPath(filepathtotal);
   is.init( file,0x01, 00004, null); // Je ne sais plus la signification des paramètres 0x01, 00004 et null
                                     // (voir la doc de nsILocalFile),
                                     // mais ça fonctionne comme ça.
 }  
 /**/
 return is;
 /**/
}

Je peux alors utiliser mon xslt de cette manière :

var urlxslt = "test.xsl";
var is = chromeInputStream(urlxslt);
var docstylesheet = parser.parseFromStream(is,"UTF-8",-1,"application/xml");
var xsltproc = new XSLTProcessor;
xsltproc.importStylesheet(docstylesheet);
var domdoc = xsltproc.transformToDocument(objXML);

Ma fonction mérite certainement des améliorations pour la rendre plus générique, mais si ça peut aider...

# Re: pb chargement XML et XSLT

Envoyé par : Cheub

Date : 29/06/2006 17:41

Effectivement c'est un peu compliqué... :) J'ai trouvé plus simple, je le posterai dès que j'ai le temps. Merci beaucoup pour vos réponses, elles m'ont bien aidé.

Une remarque : est-ce normal que le XSLTProcessor ne prend pas en compte le texte de type CDATA? Il l'ignore complétement... (mais je ne connais pas la norme par coeur donc peut-être est-ce un comportement normal.)

Il n'est plus possible de poster des messages dans ce forum.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.