XSL a-t-il de la mémoire??

XSL a-t-il de la mémoire?? - XML/XSL - Programmation

Marsh Posté le 15-05-2003 à 09:18:31    

Salut tout le monde!
 
je dois effectuer des transformations de doc XML en d'autres formats, et pour ce faire j'ai besoin de mémoriser des données au fur et à mesure du parcours du doument XML. C'est pourquoi j'aimerais savoir si XSLT dispose de structures de données de type table de hachage, ou s'il travaille uniquement en séquentiel.
 
par ailleurs, savez vous s'il existe des compteurs (genre i=0, puis i++ à chaque balise "machin" )?
 
merci!

Reply

Marsh Posté le 15-05-2003 à 09:18:31   

Reply

Marsh Posté le 15-05-2003 à 10:04:15    

Si tu aborde XSL comme un language de programmation traditionnel tu va être très déçu : pas de tables de hachage, ni structures de données, ni même de variables ( tu peux définir une variable mais PAS modifier son contenu)!!!
 
Note qu'on ne travaille pas séquentiellement non plus! Le language est conçu pour être 'data driven' càd. que se sont les données ( l'XML donc) qui décident de l'ordre du traitement.
 
Si tu veux aborder l'XML de manière séquentielle il faut utiliser un parser SAX.  
 
Avander


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

Marsh Posté le 15-05-2003 à 10:07:32    

ouaip, je connais relativement bien XML, mais je commence juste XSL.
 
d'après les tutaux que j'ai lu, on n'a effectivement aucun moyen de savoir que tel noeuds est le Xième de son niveau, etc..
c très embêtant pour moi!
tant pis, je vais devoir faire encore du SAX/DOM.
 
merci!

Reply

Marsh Posté le 15-05-2003 à 10:17:07    

Si si, tu peut le savoir en utilisant une fonction qui s'appele count().  
 
Tu utilise quelle moteur de transformations?
 
Avander


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

Marsh Posté le 15-05-2003 à 10:20:10    

ben apparemment, y'a une astuce qui permet de savoir et de se rappeler ce que je recherche.
Pour l'instant, je n'utilise aucun processeur XSLT, j'étudie juste la faisabilité du projet. Et visiblement, on a la possibilité de simuler un tableau de hachage (quelqu'un dans mon entourage s'en est déjà servi, mais il a pomé la référence).
 
donc je cherche!  :jap:

Reply

Marsh Posté le 15-05-2003 à 10:25:08    

Euh, avant de dire que l'on ne peut pas faire ceci ou cela avec XSLT, faudrait jeter un oeil aux bouquins qui montrent tout ce que l'on peut faire avec...

  • XSLT Cookbook, de Sal Mangano, ed. O'Reilly (Bouquin excellentissime, bourré d'exemple dont on peut s'inspirer)
  • Inside XSLT, de Steven Holzner, ed. New Riders
  • Definitive XSLT and XPath, de G. Ken Holman, ed. Rrentice Hall
  • XSLT Quickly, de Bob DuCharme, ed. Manning
  • XSLT Working with XML and HTML, de Khun Yee Fung, ed. Addison Wesley

Sans oublier le manuel de reference

  • XSLT Programmer's Reference, de Michael Kay, ed. Wrox


A+,


Message édité par gilou le 15-05-2003 à 10:26:12

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-05-2003 à 10:27:43    

ouaip, c'est ce que je viens de voir!
 
je ne dis pas "on peut pas faire ça avec XSLT", je dis juste, "il semble d'après ce que j'ai lu qu'on peut pas le faire directement" mais il y a une astuce pour y parvenir (il me semble d'ailleurs qu'elle est dans le cookbook O'Reilly, mais je ne l'ai pas et je dois trouver la solution maintenant!)
 
merci pour les ref!

Reply

Marsh Posté le 15-05-2003 à 10:32:25    

Merci pour les références de livres XSL, sympa!
 


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

Marsh Posté le 15-05-2003 à 10:34:17    

Avander a écrit :

Merci pour les références de livres XSL, sympa!
 
 

XSLT  
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 15-05-2003 à 17:46:07    

bon alors, je confirme, on ne peut pas faire ce que je veux directement avec une fonction XSLT. par contre, il y a xsl:key qui permet de grouper les noeuds identiques en fonction d'un argument de son choix)

Reply

Marsh Posté le 15-05-2003 à 17:46:07   

Reply

Marsh Posté le 16-05-2003 à 08:53:41    

je pense que ta manière d'appréhender XSLT n'est pas la bonne... tu n'as pas besoin de tout ça : il ne faut pas l'aborder de la même manière qu'un language classique...
à la rigueur, si tu as besoin de stocker des valeurs, peut être peux tu effectuer deux transformations XSLT successive, mais même sans ça je pense que tu peux y arriver... il faudrait que tu détailles ton problème...

Reply

Marsh Posté le 16-05-2003 à 08:54:53    

la lecture de ton autre post me confirme que tu ne t'y prend pas de la bonne manière en essayant d'utiliser XSLT

Reply

Marsh Posté le 16-05-2003 à 08:59:37    

arghbis a écrit :

bon alors, je confirme, on ne peut pas faire ce que je veux directement avec une fonction XSLT. par contre, il y a xsl:key qui permet de grouper les noeuds identiques en fonction d'un argument de son choix)


 
pour faire des sélections de noeuds, je te conseillerai plutot XPATH

Reply

Marsh Posté le 16-05-2003 à 09:20:20    

ben mon problème est le suivant:
- en xml :
<info>
   <infoList>
       <infoItem id=a/>
       <infoItem id=b />
       <infoItem id=c />
   </infoList>
   <infoRelationList>
       <infoRelation id=d>
            <infoItem ref=a />
            <infoItem ref=b />
       </infoRelation>
       <infoRelation id=e>
            <infoItem ref=b />
            <infoItem ref=c />
       </infoRelation>
    </infoRelationList>
</info>
 
- à transformer en :
(infoItem 1 2 3)
(infoRelation 1 1 2)
(infoRelation 2 2 3)
 
plus d'autres balises à transformer, mais toujours dans le même genre. Hier soir j'ai vu un truc xsl:number qui pourrait peut-être m'aider, alors je cherche!
 
merci de vous pencher sur mon problème (et j'ai bien compris que XSLT n'est pas un langage de programmation !! malheureusement  :whistle: )

Reply

Marsh Posté le 16-05-2003 à 11:43:36    

Les données XML ( /!\ j'ai du rajouter des " aux attributs):


<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<info>
  <infoList>
      <infoItem id="a"/>
      <infoItem id="b"/>
      <infoItem id="c"/>
  </infoList>
  <infoRelationList>
      <infoRelation id="d">
           <infoItem ref="a"/>
           <infoItem ref="b"/>
      </infoRelation>
      <infoRelation id="e">
           <infoItem ref="b"/>
           <infoItem ref="c"/>
      </infoRelation>
  </infoRelationList>
</info>
<!-- eof -->


 
Le stylesheet :


<?xml version="1.0" encoding="ISO-8859-1"?>
 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 
<!-- general settings -->
  <xsl:output method="text" omit-xml-declaration="no" encoding="ISO-8859-1"/>
 
<!-- parameters -->
 
<!-- global variables -->
 
<!-- transformations -->
  <xsl:key name="lookup" match="infoItem" use="@id"/>
 
  <xsl:template match="/">
    <xsl:apply-templates/>
  </xsl:template>
 
 
  <xsl:template match="info">
    <xsl:text>(infoItem </xsl:text>
    <xsl:apply-templates select="./infoList/infoItem"/>
    <xsl:text> )
    </xsl:text>
 
    <xsl:apply-templates select="./infoRelationList/infoRelation"/>
  </xsl:template>
 
 
  <xsl:template match="infoItem">
    <xsl:text> </xsl:text>
    <xsl:value-of select="position()"/>
  </xsl:template>
 
 
  <xsl:template match="infoRelation">
 
    <xsl:text>(infoItem </xsl:text>
    <xsl:value-of select="position()"/>
    <xsl:text> - </xsl:text>
 
    <xsl:for-each select="./infoItem/@ref">
      <xsl:text> </xsl:text>
      <xsl:for-each select="key('lookup', .)">
        <xsl:value-of select="count( preceding-sibling::*)+1"/>
      </xsl:for-each>
    </xsl:for-each>
 
    <xsl:text> )</xsl:text>
  </xsl:template>
 
</xsl:stylesheet>
<!-- eof -->


 
Le résultat avec MSXML3 :  


(infoItem  1 2 3 )
    (infoItem 1 -  1 2 )(infoItem 2 -  2 3 )


 
Avander


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

Marsh Posté le 16-05-2003 à 11:46:03    

huum, ça m'a l'air bien sympa tout ça!!
 [:spikler]  
je vais me le transformer pour ma structure exacte, mais merci beaucoup!

Reply

Marsh Posté le 16-05-2003 à 15:12:59    

bon j'ai réussi à le modifier pour avoir le début de ce que je veux (en fait, ta méthode ne marche pas s'il y a de la redondance au niveau des infoItem, mais c bon, j'ai trouvé)
 
par contre, est-ce possible de faire plusieurs apply-templates sur le même type de balise, genre :  
 
 
 <xsl:template match="info">
   <xsl:text>(infoItem </xsl:text>
   <xsl:apply-templates select="./infoList/infoItem"/>
   <xsl:text> )
   </xsl:text>
 
   <xsl:apply-templates select="./infoRelationList/infoRelation"/>
<xsl:apply-templates select="./infoList/infoItem"/>
 </xsl:template>
 
alors??

Reply

Marsh Posté le 16-05-2003 à 16:15:07    

bon j'ai trouvé! je crois qu'en fait je suis pas encore bien habitué à la logique XSLT, mais ça vien, et finalement, c pas si illogique!!  :whistle:  
 
merci @ tous pour votre aide!

Reply

Marsh Posté le 16-05-2003 à 22:53:45    

Une autre approche intéressante :
 

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:template match="info|infoRelationList">
  4. <xsl:apply-templates select="*" />
  5. </xsl:template>
  6. <xsl:template match="infoList|infoRelation">
  7. (<xsl:value-of select="name()" />
  8. <xsl:if test="@id"><xsl:text> </xsl:text><xsl:value-of select="position()" /> - </xsl:if>
  9. <xsl:apply-templates select="*" /> )
  10. </xsl:template>
  11. <xsl:template match="infoItem[@id]">
  12. <xsl:text> </xsl:text><xsl:value-of select="position()" />
  13. </xsl:template>
  14. <xsl:template match="infoItem[@ref]">
  15. <xsl:text> </xsl:text><xsl:value-of select="count(/info/infoList/infoItem[@id=current()/@ref]/preceding-sibling::infoItem)+1" />
  16. </xsl:template>
  17. </xsl:stylesheet>


Résultat :

Code :
  1. (infoList 1 2 3)
  2. (infoRelation 1 - 1 2)
  3. (infoRelation 2 - 2 3)


Message édité par chocoboy le 16-05-2003 à 22:56:45
Reply

Sujets relatifs:

Leave a Replay

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