Page 1 sur 1

Transformation XSLT avec javascript...

Publié : 27 janv. 2006, 05:20
par Spack
Salut,
J'essais de faire une transformation XSLT d'un fichier XML côté client à l'aide de javascript... Pour ce faire, je charge mes deux fichiers

Code : Tout sélectionner

this.xmlDoc = document.implementation.createDocument('', 'doc', null);
this.xmlDoc.load(url);
Puis et voici le code censé faire la transformation

Code : Tout sélectionner

var fragment;
var xsltProcessor = new XSLTProcessor();
			
xsltProcessor.importStylesheet(xsl);
fragment = xsltProcessor.transformToFragment(xml, document);
var tmp = document.getElementById(id);
tmp.innerHTML = fragment;
Mais malheureusement, j'ai cette erreur
[Exception... "Component returned failure code: 0x80600001 [nsIXSLTProcessor.importStylesheet]"
à la ligne xsltProcessor.importStylesheet(xsl);...

Pouvez-vous me dire quel est le problème :?

Publié : 27 janv. 2006, 08:54
par calimo
Avec si peu de code, pas vraiment, mais si tu avais posté dans la rubrique "développement web" tu aurais évité de voir ton message perdu dans les abysses de cette rubrique avant que quelqu'un de compétent ne passe :?

Publié : 27 janv. 2006, 13:15
par martin
- vérifier si les url des document chargés par load() sont valides (je sais, basique, mais on sait jamais...).

- il se peut qu'il faille passer par un evenement onload (il se peut que load soit asynchrone, je ne sais plus). Facile à vérifier, place un alert("toto") avant l'import de la feuille de style, çà laissera le temps de charger le fichier si c'est asynchrone.
un lien

Le plus simple c'est quand même de mettre un point d'arrêt dans le debugger Venkman, et de vérifier ce que contienne tes variables xsl et xml.

Publié : 27 janv. 2006, 15:14
par Spack
calimo a écrit :Avec si peu de code, pas vraiment, mais si tu avais posté dans la rubrique "développement web" tu aurais évité de voir ton message perdu dans les abysses de cette rubrique avant que quelqu'un de compétent ne passe :?
Oui je me suis emmêlé les pinceaux lors du post...

Voici quelques explications...
J'ai deux classes xmlParser chargement et parcours de fichier xml mais dans le cas présent je n'utilise que la fonction de chargement...

Code : Tout sélectionner

function loadXML(url)
{
  /* chargement du fichier XML */
  try {
    // navigateur basé sur Gecko
    if (document.implementation && document.implementation.createDocument)
    {
      this.xmlDoc = document.implementation.createDocument('', 'doc', null);
      this.xmlDoc.load(url);
    // ActiveX pour Internet Explorer
    } else if (window.ActiveXObject) {
      try {
        this.xmlDoc = new ActiveXObject('Msxml2.XMLDOM');
      } catch (e) {
        this.xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
      }
      this.xmlDoc.async = false;
      this.xmlDoc.load(url);
    // à l'aide de lobjet XMLHTTPRequest
    } else if (window.XMLHttpRequest) {
      this.xmlDoc = new XMLHttpRequest();
      this.xmlDoc.overrideMimeType('text/xml'); 
      this.xmlDoc.open('GET', url, false);
      this.xmlDoc.send(null);
      if (this.xmlDoc.readyState == 4)
        this.xmlDoc = this.xmlDoc.responseXML.documentElement;
    }
  } catch (e) {
    alert(e);
    return false;
  }
  return true;
}
Et ensuite une classe xmlManager qui traite les fichiers xml dans le cas présent, je n'utilise que la fonction transform(xml, xsl, id)...

Code : Tout sélectionner

function transform(xml, xsl, id)
{
  xml = xml.xmlDoc;
  xsl = xsl.xmlDoc;
	
  try {
    // Gecko
    if (window.XSLTProcessor)
    {
      var fragment;
      var xsltProcessor = new XSLTProcessor();
			
      xsltProcessor.importStylesheet(xsl);
      fragment = xsltProcessor.transformToFragment(xml, document);
      var tmp = document.getElementById(id);
      tmp.innerHTML = fragment;
    } else if (window.ActiveXObject) {
      var target = document.getElementById(id);
      target.innerHTML = xml.transformNode(xsl);
    }
  } catch (e) {
      return e;
  }
}
j'appelle ces fonctions après avoir contruit les objet respectifs avec:

Code : Tout sélectionner

xml.loadXML('./news.xml');
xsl.loadXML('./news.xml');
news.transform(xml, xsl, 'news');

Publié : 27 janv. 2006, 16:19
par martin
franchement, installe Venkman dans ton firefox, place des points d'arrêts et surveille tes variables (et par la suite tu ne pourras plus t'en passer).
Là j'ai du mal à percevoir ta construction des objets, c'est peut être elle qui est en cause.

Publié : 27 janv. 2006, 16:30
par Spack
martin a écrit :franchement, installe Venkman dans ton firefox, place des points d'arrêts et surveille tes variables (et par la suite tu ne pourras plus t'en passer).
Là j'ai du mal à percevoir ta construction des objets, c'est peut être elle qui est en cause.
J'ai déjà installer Venkman...

Code : Tout sélectionner

xml.loadXML('./news.xml');
xsl.loadXML('./news.xml');
news.transform(xml, xsl, 'news');
Si on regarde bien, on voit qu'en fait je charge deux fois le fichier news.xml ou lieu de mettre news.xsl... :oops: Tout cela pour une simple lettre... :D

L'erreur est humaine :roll:

Publié : 27 janv. 2006, 18:36
par martin
ah ben oui :D , c'est le premier point de recherche que j'avais proposé :lol: , vérifier les urls .