XSL + Javascript -> probleme :(

XSL + Javascript -> probleme :( - HTML/CSS - Programmation

Marsh Posté le 26-02-2003 à 10:36:41    

Voila,
 
j'ai une feuille xml que je transforme a l'aide d'une xsl toute bete, la ok
 
ensuite maintenant dans ma feuille xsl j'aimerais que la transformation se fasse sur base d'un code javascript qui m'affichera un menu style windows explorer
 
le prob c'est que la feuille xsl est considere non valide et trouve des erreurs dans le javascript (alors que j'ai teste le javascript a part et ca marche bien)
 
quelqu'un sait comment contourner le probleme?
 
merci

Reply

Marsh Posté le 26-02-2003 à 10:36:41   

Reply

Marsh Posté le 26-02-2003 à 10:47:22    

code ?

Reply

Marsh Posté le 26-02-2003 à 10:52:03    

le fichier xml :  
 

Code :
  1. <?xml version="1.0" encoding="windows-1252" ?>
  2. <?xml-stylesheet type="text/xsl" href="menudb.xsl"?>
  3. <ROWSET>
  4.   <ROW num="1">
  5.     <DB_ID>1</DB_ID>
  6.     <DB_NAME>ARWP</DB_NAME>
  7.   </ROW>
  8.   <ROW num="2">
  9.     <DB_ID>2</DB_ID>
  10.     <DB_NAME>ARWA</DB_NAME>
  11.   </ROW>
  12.   <ROW num="3">
  13.     <DB_ID>3</DB_ID>
  14.     <DB_NAME>EW3P</DB_NAME>
  15.   </ROW>
  16.   <ROW num="4">
  17.     <DB_ID>4</DB_ID>
  18.     <DB_NAME>WW3T</DB_NAME>
  19.   </ROW>
  20.   <ROW num="5">
  21.     <DB_ID>5</DB_ID>
  22.     <DB_NAME>WW3D</DB_NAME>
  23.   </ROW>
  24. </ROWSET>


 
le fichier xsl :  
 

Code :
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3. <xsl:template match="/">
  4.     <SCRIPT LANGUAGE='JAVASCRIPT'>
  5.     if (navigator.appName=="Netscape" ){document.writeln('<layer name="menu" left="0" top="0"></layer>');}
  6. else{document.writeln('<div id="menu" style="position:absolute;left:0px;top:0px;width:320px;height:16px;"></div>');}
  7. var type;type = new Array();
  8. var level;level = new Array();
  9. var texte;texte = new Array();
  10. var status;status = new Array();
  11. var image;image = new Array();
  12. var lien;lien = new Array();
  13. var pere;pere = new Array();
  14. var ok=0;var nb=1;var Apere=0;var Alevel=1;var oldpere=0;
  15. //
  16. // La cible par defaut pour les liens
  17. //
  18. var Acible="DataFrame";
  19. //
  20. function ajouter(Anew,Atype,Atexte,Aimage,Alien) {
  21.   if (Anew==1) {Apere=0;Alevel=1;}
  22.   type[nb]=Atype;
  23.   level[nb]=Alevel;
  24.   pere[nb]=Apere;
  25.   status[nb]=0;
  26.   texte[nb]=Atexte;
  27.   image[nb]=Aimage;
  28.   lien[nb]=Alien;
  29.   if (Atype==1) {Apere=nb;}
  30.   nb+=1;if (Atype==1) {Alevel+=1;}
  31. }
  32. function ouvre(num){
  33. status[num]=1;affMenu();
  34. }
  35. function ferme(num){
  36. status[num]=0;affMenu();
  37. }
  38. function verif(num){
  39. if (pere[num]!=0) {
  40.   while (pere[num]!=0) {
  41.    num=pere[num];
  42.    if (status[num]==0) {ok=0;}
  43.   }
  44. }
  45. }
  46. function affMenu(){
  47. var chaine = "";var saute=0;var niveau=1;
  48. for (var i = 1; i < texte.length; i++) {
  49.   ok=1;
  50.   verif(i);
  51.   if (ok==1) {
  52.    for (var j = 1; j < level[i]; j++) {
  53.     if (j == level[i]-1) {
  54.      chaine+="<img src='espacef.gif' align='top'>";}
  55.     else {
  56.      chaine+="<img src='espace2.gif' align='top'>";}
  57.    }
  58.    if (type[i]==1) {
  59.     if (status[i]==0) {
  60.      chaine+="<img src='fermer.gif' border='0' align='top' onmouseup='ouvre("+i+" )'> ";
  61.      chaine+="<A HREF='javascript:ouvre("+i+" )' class='liens'>"+texte[i]+"</a>";
  62.     }
  63.     else {
  64.      chaine+="<img src='ouvert.gif' border='0' align='top' onmouseup='ferme("+i+" )'> ";
  65.      chaine+="<A HREF='javascript:ferme("+i+" )' class='liens'>"+texte[i]+"</a>";
  66.     }
  67.    }
  68.    else {
  69.     chaine+="<A HREF='"+lien[i]+"' class='liens' target='"+Acible+"'>";
  70.     if (image[i]=="" ) {
  71.      chaine+="<img src='lien.gif' border='0' align='top'> ";
  72.     }
  73.     else {
  74.      chaine+="<img src='"+image[i]+"' border='0' align='top'> ";
  75.     }
  76.     chaine+=texte[i];
  77.     chaine+="</A>"
  78.    }
  79.    chaine+="<BR>";
  80.   }
  81. }
  82. if (navigator.appName=="Netscape" ){
  83.   document.layers['menu'].document.write(chaine);
  84.   document.layers['menu'].document.close();
  85. }
  86. else{
  87.   menu.innerHTML=chaine;
  88. }
  89. }
  90. <xsl:for-each select="ROWSET/ROW">
  91. ajouter(1,1,<xsl:value-of select="DB_NAME"/>,"","#" );
  92. </xsl:for-each>
  93. </SCRIPT>
  94. </xsl:template>
  95. </xsl:stylesheet>

Reply

Marsh Posté le 26-02-2003 à 10:57:50    

[:miracle] Euh... on peut mélanger comme ça du JS et du XSL ? Ca m'semble douteux.


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 26-02-2003 à 10:59:38    

ben c'est ce que je suis en train de me demander en fait...
 
si on peut pas, mon menu style windows explorer je l'ai dans le c** :(

Reply

Marsh Posté le 26-02-2003 à 11:02:34    

oui oui on peut, je l'ai deja fait, mais par contre, j'avais du passer en plus par une page html.
ce qui n'empechait pas d'avoir du java script dans le xls avec des tests inférieurs supérieurs... parce que c'est sur le  

Code :
  1. for (var i = 1; i<texte.length; i++)


qu'il coince...


Message édité par walli le 26-02-2003 à 11:03:09
Reply

Marsh Posté le 26-02-2003 à 11:05:11    

Slash- a écrit :


si on peut pas, mon menu style windows explorer je l'ai dans le c** :(


 
Les fichiers .js, c'est pratique, et en plus, les navigateurs le mettent dans leur cache :)


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 26-02-2003 à 11:08:54    

malheureusement walli, ce n'est pas la seule erreur, je l'ai vue et corrigé mais yen a plusieurs plus bas du meme genre ou alors avec des tags qui sont censés ne pas etre bien fermés etc...
 
kadreg, je peux pas utiliser de fichier, une des contraintes est que tout doit etre dans la base de données, donc si je savais mettre le tout dans le fichier puis le foutre dans la bd oracle ca pas de probleme, mais mettre un fichier javascript dans la bd, puis dans l'xsl faire un select pour ce fichier... ca m'a l'air tres douteux aussi...

Reply

Marsh Posté le 26-02-2003 à 11:22:31    

vais jeter un coup d'oeil...
en fait mon fichier xsl il a cette structure :  

Code :
  1. <?xml version="1.0" encoding="windows-1252" ?>
  2. <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"
  3.                 xmlns="http://www.w3.org/TR/REC-html40" result-ns="">
  4. <xsl:script><![CDATA[
  5.    ici mes fonctions...
  6. ]]></xsl:script>
  7. <xsl:template match="/">
  8. <table border="1" width="100%" cellspacing="0" cellpadding="0" bgcolor="#DCDCDC">
  9. <tr>
  10.  <td class="libelle"><B>Informations familiales</B></td>
  11.  <td class="libelle"><center><B>Prospect</B></center></td>
  12.   <xsl:if expr="aEnfantOuConjoint">
  13.    <td class="libelle"><center><B>Conjoint</B></center></td>
  14.   </xsl:if>
  15.  <xsl:for-each select="//ASSURE/@TETE">
  16.   <xsl:if expr="isValide(this);">
  17.    <td class="libelle"><center><B>Enfant <xsl:value-of select="."/></B></center></td>
  18.   </xsl:if>
  19.  </xsl:for-each>
  20. </tr>
  21. etc etc etc...
  22. </xsl:template>
  23. </xsl:stylesheet>


Message édité par walli le 26-02-2003 à 11:29:35
Reply

Marsh Posté le 26-02-2003 à 11:37:10    

Le problème c'est que du code source contient souvent des caractères auquels le XML et par extension l'XSL sont très sensibles pcq. ils interfèrent avec le balisage XML. Typiquement il s'agit de <, > et &.  
 
Pour eviter que l'XSL s'y perd il faut lui dire que ce qui suit doit figurer dans le résultat telquel, donc sans l'interprêter. Exemple:  


    <xsl:text><![CDATA[
     
... ton javascript code ...
 
]]></xsl:text>



---------------
A thing of beauty is a joy forever (John Keats)
Reply

Marsh Posté le 26-02-2003 à 11:37:10   

Reply

Marsh Posté le 26-02-2003 à 12:01:35    

Pour Walli :  
 
Je connais pas le tag xsl:script et je trouve aucune référence dans la doc de mon parser ( MsXSL) ni dans mon 'XML Bible' .
 
Il fait quoi au juste??
 
Bonne continuation. Avander


---------------
A thing of beauty is a joy forever (John Keats)
Reply

Marsh Posté le 26-02-2003 à 12:11:48    

ca marche pas le xsl:text, fin si ca marche mais pas comme je voudrais,
 
ca m'affiche la page avec tout mon code javascript...

Reply

Marsh Posté le 26-02-2003 à 14:35:54    

J'ai surement pas compris ce que tu voulais, mais pour moi il s'agissait de générer une page HTML avec du javascript dedans à l'aide d'XSL et partant d'un fichier XML.  
 
Si tu veux exécuter du js dans l'XSL à l'aide du tag xsl:script prévu dans XSLT 1.1 c'est très controversé d'après ce que j'ai pu lire ici http://xmlfr.org/actualites/tech/010301-0001
 
Avander


---------------
A thing of beauty is a joy forever (John Keats)
Reply

Marsh Posté le 26-02-2003 à 14:52:13    

Avander a écrit :

J'ai surement pas compris ce que tu voulais, mais pour moi il s'agissait de générer une page HTML avec du javascript dedans à l'aide d'XSL et partant d'un fichier XML.  
 
Si tu veux exécuter du js dans l'XSL à l'aide du tag xsl:script prévu dans XSLT 1.1 c'est très controversé d'après ce que j'ai pu lire ici http://xmlfr.org/actualites/tech/010301-0001
 
Avander
 


 
ah, je savais pas ca...
 [:spamafote]  

Reply

Marsh Posté le 26-02-2003 à 16:18:44    

J'ai un peu modifié le fichier xsl.
Par contre, ca sort la 'chaine' mais il faudrait pouvoir afficher son contenu dans une pahe html et non l'afficher telle quelle, et la, je sais pas trop.
alors si ca peut t'aider un peu :  

Code :
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2.   <!--xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  3.           xmlns="http://www.w3.org/TR/REC-html40" result-ns=""-->
  4.   <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"
  5.           xmlns="http://www.w3.org/TR/REC-html40" result-ns="">
  6.                
  7.  
  8.   <xsl:script><![CDATA[
  9.      
  10.   chaine= "";
  11.   tipe = new Array();
  12.   level = new Array();
  13.   texte = new Array();
  14.   status = new Array();
  15.   image = new Array();
  16.   lien = new Array();
  17.   pere = new Array();
  18.   ok=0;nb=1;Apere=0;Alevel=1;oldpere=0;
  19.  
  20.   //
  21.   // La cible par defaut pour les liens
  22.   //
  23.   var Acible="DataFrame";
  24.   //
  25.  
  26.   function ajouter(e,Anew,Atipe,tagName,Aimage,Alien) {
  27.       if (Anew==1) {Apere=0;Alevel=1;}
  28.       tipe[nb]=Atipe;
  29.       level[nb]=Alevel;
  30.       pere[nb]=Apere;
  31.       status[nb]=0;
  32.       var Atexte = e.selectSingleNode(tagName).text;
  33.       texte[nb]=Atexte;
  34.       image[nb]=Aimage;
  35.       lien[nb]=Alien; 
  36.       if (Atipe==1) {Apere=nb;} 
  37.       nb+=1;if (Atipe==1) {Alevel+=1;}
  38.   }
  39.  
  40.   function ouvre(num){
  41.      status[num]=1;affMenu();
  42.   }
  43.  
  44.   function ferme(num){
  45.      status[num]=0;affMenu();
  46.   }
  47.  
  48.   function verif(num){
  49.      if (pere[num]!=0) {
  50.         while (pere[num]!=0) {
  51.            num=pere[num];
  52.            if (status[num]==0) {ok=0;}
  53.         }
  54.      }
  55.   }
  56.  
  57.   function affMenu(){
  58.      var saute=0;var niveau=1;
  59.      for (var i = 1; i<texte.length; i++) {
  60.         ok=1;
  61.         verif(i);
  62.         if (ok==1) {
  63.            for (var j = 1; j < level[i]; j++) {
  64.               if (j == level[i]-1) {
  65.                chaine+="<img src='espacef.gif' align='top'>";}
  66.               else {
  67.                chaine+="<img src='espace2.gif' align='top'>";}
  68.            }
  69.            if (tipe[i]==1) {
  70.               if (status[i]==0) {
  71.                  chaine+="<img src='fermer.gif' border='0' align='top' onmouseup='ouvre("+i+" )'> ";
  72.                  chaine+="<A HREF='javascript:ouvre("+i+" )' class='liens'>"+texte[i]+"</a>";
  73.               }
  74.               else {
  75.                  chaine+="<img src='ouvert.gif' border='0' align='top' onmouseup='ferme("+i+" )'> ";
  76.                  chaine+="<A HREF='javascript:ferme("+i+" )' class='liens'>"+texte[i]+"</a>";
  77.               }
  78.            }
  79.            else {
  80.               chaine+="<A HREF='"+lien[i]+"' class='liens' target='"+Acible+"'>";
  81.               if (image[i]=="" ) {
  82.                  chaine+="<img src='lien.gif' border='0' align='top'> ";
  83.               }
  84.               else {
  85.                  chaine+="<img src='"+image[i]+"' border='0' align='top'> ";
  86.               }
  87.               chaine+=texte[i];
  88.               chaine+="</A>";
  89.            }
  90.            chaine+="<BR>";
  91.         }
  92.      }
  93.      
  94.   }
  95.  
  96.  
  97.    ]]></xsl:script>
  98.    
  99.  
  100.  
  101.    <xsl:template match="/">
  102.  
  103.  
  104.  
  105.    <!--div id="menu" style="position:absolute;left:0px;top:0px;width:320px;height:16px;"></div-->
  106.  
  107.  
  108.   <xsl:for-each select="ROWSET/ROW">
  109.    <xsl:eval>ajouter(this,1,1,'DB_NAME',"","#" );</xsl:eval>
  110.   </xsl:for-each>
  111.   <xsl:eval>affMenu();</xsl:eval>
  112.   <table>
  113.    <tr>
  114.     <td><xsl:eval>chaine</xsl:eval></td>
  115.    </tr>
  116.   </table>
  117.   </xsl:template>
  118.   </xsl:stylesheet>

Reply

Marsh Posté le 26-02-2003 à 17:26:20    

Il me semble qu'on est parti pour un dialogue de sourd...  
 
D'après les tags que tu utilise, notamment ( xsl:eval et xsl:script) et le namespace xmlns:xsl="http://www.w3.org/TR/WD-xsl" dans ton exemple je dirais que tu utilise un parser XML complètement obsolète...  
 
Ca doit être l'horrible première tentative de Microsoft dans ce domaine! Tout ce qui précéde MSXML 3.0 ne respecte pas les recommandations W3C et tente d'introduire d'inombrables extensions propre à MS. A éviter comme la peste je dirai!
 
Personnelement j'utilise MSXML 3.0 et MsXSL.exe pour faire des transformations en batch!  
 
Quel sont les outils que tu utilise???  
 
A+. Avander
 
PS: Si MSXML 3.0 est installé tu dois utiliser le namespace adéquat xmlns:xsl="http://www.w3.org/1999/XSL/Transform", sinon il persiste à utiliser la version dégeu!
 


---------------
A thing of beauty is a joy forever (John Keats)
Reply

Marsh Posté le 26-02-2003 à 17:39:19    


 
euh, suis d'accord avec toi sur un point, je respecte pas les normes...
 [:spamafote]  

Reply

Marsh Posté le 26-02-2003 à 17:59:59    

Je suppose que tu sais ce que tu fais...  
 
A l'époque j'avais fait mes premières transformations avec le parser installé/livré avec IE ( et dont tu te sert encore).  
 
Pour me former je lisais XML Bible d'Elliot Rusty Harold et je tentais les exemples dans IE ( visu fichier XML avec référence à un stylesheet, IE s'occupant de la xformation en HTML.) Je me suis très vite rendu compte qu'il y avait beaucoup de divergences entre le parser IE et mon bouquin, heureusement MSXSML 3.0 est arrivé qui lui respecte quasi à la lettre les specs W3C.
 
A+. Avander  


---------------
A thing of beauty is a joy forever (John Keats)
Reply

Marsh Posté le 27-02-2003 à 12:25:30    

merci pour vos reponse mais je pense que je vais abandonner cette solution, c'est beaucoup trop de chipotage a mon gout ...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed