Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2901 connectés 

  FORUM HardWare.fr
  Programmation
  XML/XSL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°394619
arghbis
salops de dauphins
Posté le 15-05-2003 à 09:18:31  profilanswer
 

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!

mood
Publicité
Posté le 15-05-2003 à 09:18:31  profilanswer
 

n°394645
avander
Posté le 15-05-2003 à 10:04:15  profilanswer
 

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)
n°394650
arghbis
salops de dauphins
Posté le 15-05-2003 à 10:07:32  profilanswer
 

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!

n°394664
avander
Posté le 15-05-2003 à 10:17:07  profilanswer
 

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)
n°394666
arghbis
salops de dauphins
Posté le 15-05-2003 à 10:20:10  profilanswer
 

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:

n°394673
gilou
Modérateur
Modzilla
Posté le 15-05-2003 à 10:25:08  profilanswer
 

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é!  --
n°394682
arghbis
salops de dauphins
Posté le 15-05-2003 à 10:27:43  profilanswer
 

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!

n°394693
avander
Posté le 15-05-2003 à 10:32:25  profilanswer
 

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


---------------
A thing of beauty is a joy forever (John Keats)
n°394702
gilou
Modérateur
Modzilla
Posté le 15-05-2003 à 10:34:17  profilanswer
 

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é!  --
n°395771
arghbis
salops de dauphins
Posté le 15-05-2003 à 17:46:07  profilanswer
 

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)

mood
Publicité
Posté le 15-05-2003 à 17:46:07  profilanswer
 

n°396362
chocoboy
Posté le 16-05-2003 à 08:53:41  profilanswer
 

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...

n°396363
chocoboy
Posté le 16-05-2003 à 08:54:53  profilanswer
 

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

n°396365
chocoboy
Posté le 16-05-2003 à 08:59:37  profilanswer
 

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

n°396372
arghbis
salops de dauphins
Posté le 16-05-2003 à 09:20:20  profilanswer
 

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: )

n°396609
avander
Posté le 16-05-2003 à 11:43:36  profilanswer
 

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)
n°396616
arghbis
salops de dauphins
Posté le 16-05-2003 à 11:46:03  profilanswer
 

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

n°396939
arghbis
salops de dauphins
Posté le 16-05-2003 à 15:12:59  profilanswer
 

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??

n°397209
arghbis
salops de dauphins
Posté le 16-05-2003 à 16:15:07  profilanswer
 

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!

n°397650
chocoboy
Posté le 16-05-2003 à 22:53:45  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  XML/XSL

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

 

Sujets relatifs
[XHTML] XSL+XHTML = FO mais où trouver le XSL ?Mes frames perdent la mémoire
[XML/XSL] pk ça marche po ??Probleme de memoire
besoin d'aide sur XML/XSL[C] Liste chainée et mémoire partagée
[C/C++] Malloc et occupation mémoire sous Win2000--LIBERATION MEMOIRE-- Garbage collector
[XSL] sous sommes[XML XSL] Gestion de tableau
Plus de sujets relatifs à : XSL a-t-il de la mémoire??


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR