XSL : <xsl:element> !!! (poussons le vice !)

XSL : <xsl:element> !!! (poussons le vice !) - XML/XSL - Programmation

Marsh Posté le 08-06-2004 à 14:31:13    

Re,
 
Je cherche cette fois ci à ajouter des élements à une balise que j'ai créé dynamiquement,
 
Voici mon code XSL :
 

Code :
  1. <xsl:for-each select='z:row'>
  2. <xsl:element name="{@NOM_FCT}" />
  3. </xsl:for-each>


 
Il me genere correctement mon xml :
 

Code :
  1. <TOTO_1 />
  2. <TOTO_2 />
  3. <TOTO_3 />


 
Je voudrais savoir par quelle maniere je pourrais rajouter des arguments à mes balises l'histoire que ca donne :
 

Code :
  1. <TOTO_1 var="my_var_01" />
  2. <TOTO_2 var="my_var_02" />
  3. <TOTO_3 var="my_var_03" />


 
Est ce possible ?
Je recupererais mes arguments depuis z:row.
 
Thx :]

Reply

Marsh Posté le 08-06-2004 à 14:31:13   

Reply

Marsh Posté le 08-06-2004 à 15:06:17    

Cette fois c'est <xsl:attribute> qu'il faut que tu utilises ;)  
 
http://www.laltruiste.com/document [...] ibute.html
 
(je ne fais pas de pub pour ce site c'est juste le premier qui m'est venu à l'esprit)

Reply

Marsh Posté le 08-06-2004 à 15:18:35    

Tu es formidable, ca marche !
 
Allé, voici la feuille en cours (pas encore finie) :
 

Code :
  1. <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'
  2. xmlns:rs='urn:schemas-microsoft-com:rowset'
  3. xmlns:z='#RowsetSchema'
  4. exclude-result-prefixes='rs z'>
  5. <xsl:output method='xml' encoding='UTF-8' omit-xml-declaration='yes'/>
  6. <xsl:template match='/xml/rs:data'>
  7. <Functions>
  8. <xsl:for-each select='z:row'>
  9.  <xsl:element name="{@NOM_FCT}">
  10.   <xsl:for-each select='var'>
  11.    <xsl:element name="{@TYPE_VAR}-03A06L04-{@NOM_VAR}">
  12.     <xsl:attribute name="Type">
  13.      <xsl:value-of select="@TYPE_VAR" />
  14.     </xsl:attribute>
  15.    </xsl:element>
  16.   </xsl:for-each>
  17.  </xsl:element>
  18. </xsl:for-each>
  19. </Functions>
  20. </xsl:template>

Reply

Marsh Posté le 08-06-2004 à 16:16:48    

Je ne sais pas si j'ai bien compris ce que tu voulais faire mais j'aurais plutôt fait ça (j'ai viré les namespace rs et z) :
 

Code :
  1. <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
  2. <xsl:output method='xml' encoding='UTF-8' />
  3.  
  4. <xsl:template match="/xml/Data">
  5. <Functions>
  6.  <xsl:apply-templates select="./*" />
  7. </Functions>
  8. </xsl:template>
  9. <xsl:template match="row">
  10. <xsl:element name="{@NOM_FCT}">
  11.  <xsl:apply-templates select="./*" />
  12. </xsl:element>
  13. </xsl:template>
  14. <xsl:template match="var">
  15. <xsl:element name="{@TYPE_VAR}-03A06L04-{@NOM_VAR}">
  16.  <xsl:attribute name="Type">
  17.   <xsl:value-of select="@TYPE_VAR" />
  18.  </xsl:attribute>
  19. </xsl:element>
  20. </xsl:template>
  21. </xsl:stylesheet>


 
Ca me semble plus dans l'esprit du XSL.

Reply

Marsh Posté le 08-06-2004 à 18:37:14    

 
Exact guiz, le for-each est destiné à un traitement hors context, la beauté et la force d'XSLT c'est justement de jouer avec de petits templates ad hoc.  
 
Je vois beaucoup de code ( sur HFR aussi) avec en gros un template match="/" et puis on traverse le document a coups de for-each...  :non:  même si on arrive à un résultat on perd tout le côté data driven de la solution... :ange:
 
Le for-each oui mais seulement en dernier recours dirais-je... :whistle:  

Reply

Marsh Posté le 09-06-2004 à 10:22:04    

Chuis d'accord, Avander. On évolue avec le temps :)
Mon premier XSLT, je faisais pleins de for-each, et je ne savais pêcher mes données qu'une seule fois. (Très embetant), et après avoir un peu mieux compris le xml/xslt, j'ai pu utiliser des templates. Et encore là, je n'avais pas encore tout compris, et je faisais des trucs assez spécial. Maintenant, que je capte encore mieux, je fais des trucs assez propre.  
On évolue, et le XML évolue.. Rendez-vous dans 10 ans quand les normes XForm, XML Query, etc. seront vraiment finalisées... :)

Reply

Marsh Posté le 09-06-2004 à 10:32:53    

Par contre je me pose une question :  
les "apply-templates" sont une sorte d'appel récursif, ce qui est désastreux au niveau perf et utilisation mémoire, donc, sans parler de tout traiter avec des for-each bien sûr, ne serait-il pas utile d'utiliser des for-each lorsque l'on a besoin de rapidité d'exécution ?

Reply

Marsh Posté le 09-06-2004 à 11:10:16    

Guiz, je me suis souvent posé la question et je n'ai pas la réponse, il faudrait faire de tests pour voir si des for-each ne sont pas plus rapides.
 
Cependant, même si les for-each sont plus lisibles pour un programmeur normal, l'esprit XSL est bien basé sur les templates et donc on peut se dire que d'une part bien écrit, un code à base de templates est plus lisibles par les spécialistes XSL et que d'autre part on peut espérer que les Transformeurs sont optimisés pour l'utilisation des templates.
 
Reste que c'est quand même une manière de voir les choses assez déroutante pour un programmeur normal. A chaque fois que je fais du XSL, j'ai l'impression de mettre de coté mon cerveau de programmeur pour réveiller celui capable de comprendre XSL tellement c'est différent. Peut-être un jour parviendrai-je à les faire fonctionner ensemble :D


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 09-06-2004 à 11:39:31    

Guiz, dans les deux cas il faut de toute façon créer l'arbre xml de ton document en mémoire et le tout traverser donc la différence doit être infime, la performance est toujours au rendez-vous pcq. tout se passe en mémoire justement! La solution templates offre énormément de souplesse et permet de découper un gros problème en petites solutions élégantes  :)  
 
Mara's Dad, moi aussi j'étais complètement dérouté au début, je n'avais jamais rien vu de pareil, c'était vraiment un autre monde. C'est justement cette différence qui m'a motivé à creuser et très vite j'ai trouvé des applications sympa dans la gestion de contenu par exemple...
 
Bonne continuation!!
 

Reply

Sujets relatifs:

Leave a Replay

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