Mettre en tableau des données entrelacées

Mettre en tableau des données entrelacées - XML/XSL - Programmation

Marsh Posté le 12-04-2007 à 19:55:14    

Bijour,
 
Je conçois un fichier .XSL pour mettre en forme et filtrer. Mon fichier source .XML a ce format,  :
 

+ <trsd:line.item>
 - <tred:line.item.number>1</tred:line.item.number>
+ <trsd:item.description>
+ <trsd:quantity>
  - <tred:quantity.qualifier code="A">
+ <trsd:quantity>
  - <tred:quantity.qualifier code="B">
+ <trsd:price.details>
 
+ <trsd:line.item>
 - <tred:line.item.number>2</tred:line.item.number>
+ <trsd:item.description>
+ <trsd:quantity>
  - <tred:quantity.qualifier code="A">
+ <trsd:quantity>
  - <tred:quantity.qualifier code="B">
+ <trsd:price.details>


 
Il est donc composé de X blocs avec le même nombre d'elements, mais qui malheureusement ne sont pas enfants, ils se suivent simplement consécutivement. Cela ne facilite pas du tout la tache. J'ai pas moyen de modifier la structure du XML source. Mon but, mettre dans un tableau ces valeurs.
 
Vu que la quantité de champs peut varier, je voudrais récuperer un tableau de variables avec des xsl:for-each de chaque element :
 

trsd:line.items[] = trsd:line.item0,trsd:line.item1,trsd:line.item2, etc
trsd:item.descriptions[] = trsd:item.description0, trsd:item.description1, trsd:item.description2, etc
tred:quantity.qualifiersA[] = tred:quantity.qualifierA0, tred:quantity.qualifierA1, tred:quantity.qualifierA2, etc
tred:quantity.qualifiersB[] = tred:quantity.qualifierB0, tred:quantity.qualifierB1, tred:quantity.qualifierB2, etc
trsd:price.detailss[] = trsd:price.details0, trsd:price.details1, trsd:price.details2, etc


 
 
Puis faire une boucle pour afficher un tableau qui reprend les éléments par bloc, un bloc par ligne :
 

<tr>
  <td>trsd:line.items[0]</td>
  <td>trsd:item.descriptions[0]</td>
  <td>tred:quantity.qualifiersA[0]</td>
  <td>tred:quantity.qualifiersB[0]</td>
  <td>trsd:price.detailss[0]</td>
</tr>
<tr>
  <td>trsd:line.items[0]</td>
  <td>trsd:item.descriptions[0]</td>
  <td>tred:quantity.qualifiersA[0]</td>
  <td>tred:quantity.qualifiersB[0]</td>
  <td>trsd:price.detailss[0]</td>
</tr>


Etc.
 
Je ne sais pas comment m'y prendre [:petrus75]
 
Ou s'il y a un moyen beaucoup plus simple, mais le fait que les elements ne soit pas hierarchisés me semble bloquer le parcours. Peut-être est-il possible de faire un parcours des noeuds d'un line.item à un autre avec des tests et une fonction de parcours de noeud ?
 
Bref, toute aide est la bienvenue.


---------------
Le topic du QLRR et FIRE - Knowledge is power. Power corrupts. Study hard, become evil.
Reply

Marsh Posté le 12-04-2007 à 19:55:14   

Reply

Marsh Posté le 12-04-2007 à 21:12:01    

Je sens que ça va inspirer autant que mon aut' topic [:petrus75]


---------------
Le topic du QLRR et FIRE - Knowledge is power. Power corrupts. Study hard, become evil.
Reply

Marsh Posté le 12-04-2007 à 23:42:36    

J'ai une idée débile mais qui doit marcher, c'est balancer mes variables XSL dans un javascript (si ça marche ?), et generer le tableau HTML à partir de ce javascript.


---------------
Le topic du QLRR et FIRE - Knowledge is power. Power corrupts. Study hard, become evil.
Reply

Marsh Posté le 13-04-2007 à 00:20:36    

Bon, passer une variable XSL à javascript c'est encore plus l'angoisse [:ula]²²²²
 
Ptain, je suis une bille en boucles, doit y avoir un foutu moyen simple de faire ça quand même ? [:mlc2]


Message édité par Slyde le 13-04-2007 à 00:20:58

---------------
Le topic du QLRR et FIRE - Knowledge is power. Power corrupts. Study hard, become evil.
Reply

Marsh Posté le 13-04-2007 à 09:56:20    

[:cosmoschtroumpf]

Reply

Marsh Posté le 30-05-2007 à 07:46:04    

Je me permets d'upper ce topic un peu vieux pour essayer d'apporter quelques pistes :
 
Pour récupérer plusieurs variables contenant chacune un type de noeuds, c'est pas dur, c'est un bête select. Ensuite, pour faire le tableau, tu peux faire un for-each sur les trsd:line-item. Dans ce for-each, je pense que si tu fais un <xsl:value-of select="position()">, tu devrais récupérer l'"index" correspondant à chaque ligne. Ensuite, c'est facile de sélectionner ce qu'il faut dans les autres variables en utilisant cet index.
 
Une autre façon de faire serait de récupérer les infos ligne par ligne. Un petit exemple (dont la source est de l'XHTML) auquel j'avais pensé (pas testé par contre) pour récupérer tout ce qui se trouve entre un h2 bien précis (non compris) et le suivant (compris) :  

$SOTD/following::html:*[preceding::html:h2[1] is $SOTD]

$SOTD est la variable contenant le h2 en question. Cet XPath va donc récupérer tous les noeuds de même niveau qui suivent ce $SOTD et dont le premier noeud précédent   du même type que $SOTD (donc h2) est $SOTD lui-même. Ca fait que dès que dès que tu tombes sur le h2 suivant, les noeuds qui suivent auront pour premier preceding h2 ce nouvel h2, et donc ne seront plus sélectionnés.
Donc dans ton cas, je pense que tu dois pouvoir faire un truc du genre:


<xsl:for-each select="trsd:line.item">
  <xsl:variable name="current_line" select="."/>
  <xsl:variable name="columns" select="$current_line/following::trsd:*[preceding::trsd:line.item[1] is $current_line]"/>
  <!-- mise en forme de $columns -->
</xsl:for-each>


 
A noter qu'aucune de ces deux méthodes ne me semble terrible niveau complexité :-/.
 
Voilà, j'espère que ça pourra t'aider, bien qu'il doive sans doute exister d'autres manières plus propres et/ou efficaces (notamment avec les apply-templates que j'ai jamais pris le temps d'apprendre, la honte).

Reply

Sujets relatifs:

Leave a Replay

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