Transformation XML==>Javascript : pb avec une affectation multi-lignes

Transformation XML==>Javascript : pb avec une affectation multi-lignes - XML/XSL - Programmation

Marsh Posté le 12-12-2003 à 11:17:26    

Salut,
 
Sois ce fichier XML :
 
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="ordre.xsl"?>
<racine>
   <contenu>
      <sg i="SVIERGE" f="#f2fde8" t="0" l="0" h="480" a="720" />
      <h i="TXTPOR" v=" 35786" />
   </contenu>
 
   <ordres>
      <f m="ROOT" />
      <op m="F01" t="361" l="406" h="220" a="291" />
    </ordres>
</racine>

 
Sois le fichier XSL :
 
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" />
<xsl:output method="html"/>
<xsl:template match="/">
<xsl:apply-templates />
<xsl:for-each select="/racine//*">              
 
  <!-- ORDRES -->
  <xsl:if test="name()='ordres'">
    <xsl:for-each select="./*">
      <xsl:choose>
        <xsl:when test="name()='op'">
op('<xsl:value-of select="@m" />','<xsl:value-of select="@t" />','<xsl:value-of select="@l" />','<xsl:value-of select="@h" />','<xsl:value-of select="@a" />');                              
        </xsl:when>
        <xsl:when test="name()='f'">
f('<xsl:value-of select="@m"/>');
        </xsl:when>
      </xsl:choose>
    </xsl:for-each>  
 
 
  </xsl:if>
 
  <!-- CONTENU -->
  <xsl:if test="name()='contenu'">
contenu='<HTML><HEAD><META http-equiv="Content-Type" content="text/html; charset=UTF-16"></META><TITLE>GLOBALgram</TITLE></HEAD><BODY id="first" style="background-color:transparent"><DIV id="principal"></DIV><DIV id="images"></DIV>';
   <xsl:for-each select="./*">              
      <xsl:choose>
        <xsl:when test="name()='sg'">          
<SPAN>
<xsl:attribute name="style">border:none;font-family:verdana;position:absolute;background-color:<xsl:value-of select="@f" />;top:<xsl:value-of select="@t" />;left:<xsl:value-of select="@l" />;width:<xsl:value-of select="@a" />;height:<xsl:value-of select="@h" />;</xsl:attribute></SPAN>\
        </xsl:when>
 
      </xsl:choose>
    </xsl:for-each>
</BODY></HTML>';
  </xsl:if>
 
</xsl:for-each>  
</xsl:template>
</xsl:stylesheet>

 
 
 
Explication :
 
je recois ce flux XML sur IE dans une frame. En Javascript, sur une autre frame où se situe déjà des fonctions, j'applique la feuille de style au flux :
 
res+=flux.transformNode(xslForme);
   eval(res);

 
Donc le XSL me transforme les ordres en appels javascript aux fonction op() et f(). Si je fais un eval de ce résultat, OK çà exécute bien les fonctions.
Je voudrais que le XSL me transforme les contenus en un ordre javascript comme celui-ci :
 
contenu='<html><body>....<span...></html>' etc...';
 
pour ensuite faire un eval() dessus.
 
Mon problème : le résultat me mets çà sur plusieurs lignes :
 
contenu='<html><body>...
<span...>
</span>
';

Donc quand on fait un eval là-dessus, çà merde.
Donc j'ai mis des \ au bout car c comme çà qu'on fait du multi-lignes dans un chaine en javascript.
Mais çà ne résoud rien.
 
Donc j'en suis là.
 
Vous avez une idée ?
 
Merci !!


---------------
Savoir c'est vivre, et maintenir dans l'ignorance c'est presque un homicide
Reply

Marsh Posté le 12-12-2003 à 11:17:26   

Reply

Marsh Posté le 12-12-2003 à 11:25:37    

Essaye de virer tout les retour à la ligne dans ton template pcq. tu ne les voit pas mais le moteur de transformation lui les voit et les reprends...


...
  <!-- ORDRES -->
  <xsl:if test="name()='ordres'">
    <xsl:for-each select="./*">
      <xsl:choose>
        <xsl:when test="name()='op'">op('<xsl:value-of select="@m" />','<xsl:value-of select="@t" />','<xsl:value-of select="@l" />','<xsl:value-of select="@h" />','<xsl:value-of select="@a" />');</xsl:when><!-- ICI -->
        <xsl:when test="name()='f'">f('<xsl:value-of select="@m"/>');</xsl:when><!-- ICI -->
      </xsl:choose>
    </xsl:for-each>  
...


 
C'est vrai que le template devient moins lisible mais parfois il faut bien passer par là :-((.


Message édité par avander le 12-12-2003 à 11:27:48
Reply

Marsh Posté le 12-12-2003 à 11:30:07    

Arf oui mais quelle galère pour maintenir le fichier XSL après !


---------------
Savoir c'est vivre, et maintenir dans l'ignorance c'est presque un homicide
Reply

Marsh Posté le 12-12-2003 à 11:55:48    

Si qq. connait un moyen de contourner ce problème autrement qu'il parle! :-))

Reply

Marsh Posté le 12-12-2003 à 13:32:45    

eval(tastring.split('\r\n').join(''));

Reply

Marsh Posté le 12-12-2003 à 13:34:56    

en mettant ça au début :
 

Code :
  1. <xsl:output method="xml" indent="no" encoding="ISO-8859-1" omit-xml-declaration="yes" />


 
ca te convient ou pas ?
 
sinon, y a un autre moyen

Reply

Marsh Posté le 12-12-2003 à 13:45:31    

sinon, je ne comprend pas pourquoi tu le fais aussi compliqué ton XSL ?
 
la structure de ton XML est elle figée ou pas ?
est tu susceptibles d'avoir des structures de noeud différentes (plusieurs <sg>, <h>....etc ?

Reply

Marsh Posté le 12-12-2003 à 13:57:01    

youdontcare a écrit :

eval(tastring.split('\r\n').join(''));


 
Cà marche, merci !!!!


---------------
Savoir c'est vivre, et maintenir dans l'ignorance c'est presque un homicide
Reply

Marsh Posté le 12-12-2003 à 13:58:31    

chocoboy a écrit :

sinon, je ne comprend pas pourquoi tu le fais aussi compliqué ton XSL ?
 
la structure de ton XML est elle figée ou pas ?
est tu susceptibles d'avoir des structures de noeud différentes (plusieurs <sg>, <h>....etc ?


 
la structure du XML est figée et je suis susceptible d'avoir plusieurs sg ou h etc...
En fait il s'agit d'une génération d'écran à la volée à partir d'un flux XML, c'est pour çà que çà semble un peu complexe. Mais évidemment je peux surement optimiser tout çà  :)


---------------
Savoir c'est vivre, et maintenir dans l'ignorance c'est presque un homicide
Reply

Marsh Posté le 12-12-2003 à 14:14:30    

cypress a écrit :


 
la structure du XML est figée et je suis susceptible d'avoir plusieurs sg ou h etc...
En fait il s'agit d'une génération d'écran à la volée à partir d'un flux XML, c'est pour çà que çà semble un peu complexe. Mais évidemment je peux surement optimiser tout çà  :)  


 
je sais pas exactement ce que tu dois obtenir en sortie, mais ce XSL sera plus facile à maintenir :
 

Code :
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  3. <xsl:output method="xml" indent="no" encoding="ISO-8859-1" omit-xml-declaration="yes"  />
  4. <xsl:template match="/">
  5. contenu='<HTML><HEAD><META http-equiv="Content-Type" content="text/html; charset=UTF-16"></META><TITLE>GLOBALgram</TITLE></HEAD><BODY id="first" style="background-color:transparent"><DIV id="principal"></DIV><DIV id="images"></DIV>';
  6. <xsl:apply-templates />
  7. </BODY></HTML>';
  8. </xsl:template>
  9. <xsl:template match="contenu|ordre">
  10. <xsl:apply-templates />
  11. </xsl:template>
  12. <xsl:template match="sg">
  13. <SPAN style="border:none;font-family:verdana;position:absolute;background-color:{@f};top:{@t};left:{@l};width:{@a};height:{@h}" />
  14. </xsl:template>
  15. <xsl:template match="h" />
  16. <xsl:template match="f|op">
  17. <xsl:value-of select="name()" />('<xsl:apply-templates select="@*" />');
  18. </xsl:template>
  19. <xsl:template match="@*">
  20. <xsl:value-of select="." />
  21. <xsl:if test="position()!=last()">,</xsl:if>
  22. </xsl:template>
  23. </xsl:stylesheet>

Reply

Marsh Posté le 12-12-2003 à 14:14:30   

Reply

Marsh Posté le 12-12-2003 à 14:25:27    

chocoboy a écrit :


 
je sais pas exactement ce que tu dois obtenir en sortie, mais ce XSL sera plus facile à maintenir :
 

Code :
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  3. <xsl:output method="xml" indent="no" encoding="ISO-8859-1" omit-xml-declaration="yes"  />
  4. <xsl:template match="/">
  5. contenu='<HTML><HEAD><META http-equiv="Content-Type" content="text/html; charset=UTF-16"></META><TITLE>GLOBALgram</TITLE></HEAD><BODY id="first" style="background-color:transparent"><DIV id="principal"></DIV><DIV id="images"></DIV>';
  6. <xsl:apply-templates />
  7. </BODY></HTML>';
  8. </xsl:template>
  9. <xsl:template match="contenu|ordre">
  10. <xsl:apply-templates />
  11. </xsl:template>
  12. <xsl:template match="sg">
  13. <SPAN style="border:none;font-family:verdana;position:absolute;background-color:{@f};top:{@t};left:{@l};width:{@a};height:{@h}" />
  14. </xsl:template>
  15. <xsl:template match="h" />
  16. <xsl:template match="f|op">
  17. <xsl:value-of select="name()" />('<xsl:apply-templates select="@*" />');
  18. </xsl:template>
  19. <xsl:template match="@*">
  20. <xsl:value-of select="." />
  21. <xsl:if test="position()!=last()">,</xsl:if>
  22. </xsl:template>
  23. </xsl:stylesheet>




 
Effectivement c'est bien mieux que ce que je fais. Et oui je débute un peu en XSL. Je te remercie pour ton aide.
 
Merci !


---------------
Savoir c'est vivre, et maintenir dans l'ignorance c'est presque un homicide
Reply

Sujets relatifs:

Leave a Replay

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