Bonjour!
Je travaille depuis quelques temps sur la mise en forme d'une feuille XML par le biais d'une feuille XSL.
Pour se faire j'utilise un script en JavaScript qui marche parfaitement sur tout les naviguateur. Tout fonctionne correctement! Smiley ravi "Mais où est le problème!?" me direz vous... Smiley biggol
Et bien le problème est que j'utilise pour trier mes colonnes de manière automatique un script en JS Open-Source que vous pourrez trouver à l'adresse suivante : http://www.kryogenix.org/code/browser/sorttable

Ce script et magnifiquement fait et bien que n'ayant rien compris au source il est très simple d'utilisation. Il suffit d'attribuer au tableau la class "sortable" et toutes les colonnes se trient automatiquement par un clique simple sur l'en-tête de la colonne. Ce script fonctionne parfaitement sur IE mais ne marche plus sur les autres navigateurs. Après de très nombreux tests je pense que cela vient du fait que le code source du tableau même n'apparait pas en clair dans l'exploreur mais semble être stocké dans la mémoire du PC client. J'utilise appendChild() pour intégrer mon tableau à ma page xHTML, les autres techniques de marchant pas.. je vous copie mon fichier JS.


function loadXML(url)
{
 var xmlDoc;
 try 
 { 
  xmlDoc = new ActiveXObject('Msxml2.XMLDOM');
 }catch (errorie1) 
  { 
   xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
  }
  
 xmlDoc.async = false;
 xmlDoc.load(url);
 
 return xmlDoc;
}
  
function displayXSL()
{
 var xmlURL = './new_cluster1.xml';
 var xslURL = './new_cluster.xsl';
 
 /*Mozilla Firefox*/
 if (window.XSLTProcessor)
 {
  try
  {
   var xslStylesheet;
   var xsltProcessor = new XSLTProcessor();
 
   // charge le fichier xslt, new_cluster.xsl
   var myXMLHTTPRequest = new XMLHttpRequest();
   myXMLHTTPRequest.open("GET", xslURL, false);
   myXMLHTTPRequest.send(null);

   // récupère le document XSL et l'importe
   xslStylesheet = myXMLHTTPRequest.responseXML;
   xsltProcessor.importStylesheet(xslStylesheet);

   // charge le fichier XML, new_cluster.xml
   myXMLHTTPRequest = new XMLHttpRequest();
   myXMLHTTPRequest.open("GET", xmlURL, false);
   myXMLHTTPRequest.send(null);

   var xmlSource = myXMLHTTPRequest.responseXML;
   var target = document.getElementById("transform");
   var resultDocument = xsltProcessor.transformToFragment(xmlSource,document);
   target.appendChild(resultDocument);
   //target.innerHTML=resultDocument; //ne fonctionne pas correctement
   //target.write(resultDocument); //ne marche pas tout simplement
  }catch (errorfirefox)
  {
   alert(errorfirefox);
  }
 }
 /*Internet Explorer*/
 else if (window.ActiveXObject) 
 {
  var xml = loadXML(xmlURL);
  var xsl = loadXML(xslURL);
  
  try
  {
   var target = document.getElementById("transform");
   target.innerHTML = xml.transformNode(xsl);
  }catch (errorie2)
   {
    alert(errorie2);
   }
 }
}


Un aperçut du rendu : http://team-xgz.perso.sfr.fr/Test/index.php (essayez IE et FF pour voir la différence)

Quelqu'un aurait une idée sur la manière de pouvoir copier mon tableau en dure dans mon fichier xHTML? Ou au pire une modification de mon script d'intégration XSL/XML qui permettrait de faire marcher le tri automatique.

Merci d'avance pour votre patience et votre temps.

Très cordialement,

Freezystem
Modifié par freezystem (30 Nov 2009 - 10:42)
Bonjour,

Le problème vient surtout de l'injection d'élément après la création de la page. D'après ce qu'est j'ai compris de sorttable, il lance sorttable.init quand la page est chargé et dans init, récupère tous les tableaux avec la class sorttable pour lui attacher les méthodes de tri.
Vu que sorttable.init est lancé avant l'existance du tableau, il faut relancer un code d'attachement, celui dans sorttable.init ou directement sorttable.init.

Si je ne me trompe pas du récupère directement un tableau ? Dans ce cas makeSortalbe directement devrait faire l'affaire
sorttable.makeSortable(resultDocument);
Désolé d'avoir mis autant de temps à répondre mais je n'ai pas vraiment eu de temps pour m'en occupé la semaine dernière.
Grand MERCI à toi (En Majuscules! ^^) pour ce petit bout de code qui m'a éclairé!

Voici donc la solution à mon problème. Il suffisait juste de recharger le script à la fin du chargement du tableau avec l'instruction suivante;

sorttable.makeSortable(document.getElementById("cluster_table"));

où "cluster_table" est l'ID de ma table à trier. Sans plus attendre voici le code finale :


function loadXML(url)
{
 var xmlDoc;
 try 
 { 
  xmlDoc = new ActiveXObject('Msxml2.XMLDOM');
 }catch (errorie1) 
  { 
   xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
  }
  
 xmlDoc.async = false;
 xmlDoc.load(url);
 
 return xmlDoc;
}
  
function displayXSL()
{
 var xmlURL = './new_cluster1.xml';
 var xslURL = './new_cluster.xsl';
 
 /*Mozilla Firefox*/
 if (window.XSLTProcessor)
 {
  try
  {
   var xslStylesheet;
   var xsltProcessor = new XSLTProcessor();
 
   // charge le fichier xslt, new_cluster.xsl
   var myXMLHTTPRequest = new XMLHttpRequest();
   myXMLHTTPRequest.open("GET", xslURL, false);
   myXMLHTTPRequest.send(null);

   // récupère le document XSL et l'importe
   xslStylesheet = myXMLHTTPRequest.responseXML;
   xsltProcessor.importStylesheet(xslStylesheet);

   // charge le fichier XML, new_cluster.xml
   myXMLHTTPRequest = new XMLHttpRequest();
   myXMLHTTPRequest.open("GET", xmlURL, false);
   myXMLHTTPRequest.send(null);

   var xmlSource = myXMLHTTPRequest.responseXML;
   var target = document.getElementById("transform");
   var resultDocument = xsltProcessor.transformToFragment(xmlSource,document);
   target.appendChild(resultDocument);
   sorttable.makeSortable(document.getElementById("cluster_table")); //Ajoutez la ligne ici!
  }catch (errorfirefox)
  {
   alert(errorfirefox);
  }
 }
 /*Internet Explorer*/
 else if (window.ActiveXObject) 
 {
  var xml = loadXML(xmlURL);
  var xsl = loadXML(xslURL);
  
  try
  {
   var target = document.getElementById("transform");
   target.innerHTML = xml.transformNode(xsl);
  }catch (errorie2)
   {
    alert(errorie2);
   }
 }
}


Merci encore! Smiley biggrin

Freezystem!
Modifié par freezystem (30 Nov 2009 - 12:12)