Transformation XSLT avec javascript...

HTML5, CSS3, Javascript, support des mobiles... Que penser de votre site ? Vous manquez d'informations pour la construction d'un site qui puisse s'afficher correctement partout ? C'est un problème simple, un peu complexe ? Venez ici !
Spack

Transformation XSLT avec javascript...

Message 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 :?
calimo
Animal mythique
Messages : 14118
Inscription : 26 déc. 2003, 11:51

Message 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 :?
martin
Varan
Messages : 1074
Inscription : 21 janv. 2004, 16:23

Message 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.
Spack
Arias
Messages : 2
Inscription : 27 janv. 2006, 05:22

Message 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');
Dernière modification par Spack le 27 janv. 2006, 16:31, modifié 1 fois.
martin
Varan
Messages : 1074
Inscription : 21 janv. 2004, 16:23

Message 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.
Spack
Arias
Messages : 2
Inscription : 27 janv. 2006, 05:22

Message 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:
martin
Varan
Messages : 1074
Inscription : 21 janv. 2004, 16:23

Message par martin »

ah ben oui :D , c'est le premier point de recherche que j'avais proposé :lol: , vérifier les urls .
Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 2 invités