[XML/XSL] Mise en forme de 2 requetes en meme tps

Mise en forme de 2 requetes en meme tps [XML/XSL] - XML/XSL - Programmation

Marsh Posté le 08-07-2003 à 12:22:11    

Edit:Nouveau problème plus loin...
     Premier problème résolu
 
Je recupere les données de 2 requetes dans une feuille XML
structure du fichier xml correspondant
<DOCUMENT>
<REQUETE1>
 <ROWSET>
  <ROWR1>
  </ROWR1>
 </ROWSET>
</REQUETE1>
<REQUETE2>
 <ROWSET>
  <ROWR2>
  </ROWR2>
 </ROWSET>
</REQUETE2>
en mettant plusieurs enregistrement au milieu
je dois afficher dans mon tablo des lignes sous la forme suivante:
Info ROWR1 Info ROWR2
Info ROWR1 Info ROWR2
 
donc g qqchose qui ressemble a ca:
 
<xsl:for-each select="DOCUMENT/REQUETE/ROWSET/ROW">
 <tr>
  <td align="CENTER"><xsl:value-of select="NUMCONT"/></td>
  <ici je voudrais afficher les resultats de requete2 sachant qu il peut y en avoir plusieur pour 1 resultat de requete1>  
 </tr>
 
 
==> et la probleme : je ne pe pas acceder a la partie Requete2 de mon fichier xml
si je fais la boucle plus haut (Document) je ne fais qu un tour de boucle et donc ce n'est pas bon
 
comment faire?


Message édité par hop le fou le 09-07-2003 à 10:44:17
Reply

Marsh Posté le 08-07-2003 à 12:22:11   

Reply

Marsh Posté le 08-07-2003 à 14:16:40    

Comment détermines tu qu'il y a plusieurs ROW2 pour une ROW1 ( et l'inverse éventuellement)? Sans ça je ne vois point de solution...
 
A+


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

Marsh Posté le 08-07-2003 à 14:23:49    

Avander a écrit :

Comment détermines tu qu'il y a plusieurs ROW2 pour une ROW1 ( et l'inverse éventuellement)? Sans ça je ne vois point de solution...
 
A+


 
g pas bien compris la question...
mais ce n'est pas ca le pb...
 
voici le code

Code :
  1. <xsl:for-each select="DOCUMENT/REQUETE/ROWSET/ROW">
  2.  <tr>
  3.   <td align="CENTER"><xsl:value-of select="NUMCONT"/></td>
  4.   <td align="CENTER" class="LL"><xsl:value-of select="REFPROD"/></td>
  5.   <td align="RIGHT" class="LL"><xsl:value-of select="PRANN"/></td>
  6.   <td align="CENTER" class="LL"><xsl:value-of select="POSITION"/></td>
  7.   <xsl:if test="not(REQUETE2/ROWSET/ROW)"><td align="CENTER" class="LL">-</td><td align="CENTER" class="LL">-</td><td align="CENTER" class="LL">-</td><td align="RIGHT" class="LL">-</td><td align="RIGHT" class="LL">-</td><td align="RIGHT" class="LL">-</td><td align="RIGHT" class="LL">-</td></xsl:if>
  8.   <xsl:if test="REQUETE2/ROWSET/ROW">
  9.    <td align="CENTER" class="LL"><xsl:value-of select="REQUETE2/ROWSET/ROW/NUMSIN"/></td>
  10.    <td align="CENTER" class="LL"><xsl:value-of select="REQUETE2/ROWSET/ROW/SURV"/></td>
  11.    <td align="CENTER" class="LL"><xsl:value-of select="REQUETE2/ROWSET/ROW/GARANTIE"/></td>
  12.    <td align="RIGHT" class="LL"><xsl:value-of select="REQUETE2/ROWSET/ROW/REGLEM"/></td>
  13.    <td align="RIGHT" class="LL"><xsl:value-of select="REQUETE2/ROWSET/ROW/EVAL"/></td>
  14.    <td align="RIGHT" class="LL"><xsl:value-of select="REQUETE2/ROWSET/ROW/RECOURS"/></td>
  15.    <td align="RIGHT" class="LL"><xsl:value-of select="REQUETE2/ROWSET/ROW/EVALREC"/></td>
  16.   </xsl:if>
  17.  </tr>
  18. <xsl:for-each select="REQUETE2/ROWSET/ROW[@num&gt;1]">
  19.    <tr>
  20.    <td colspan="4"/>
  21.    <td align="CENTER" class="LL"><xsl:value-of select="NUMSIN"/></td>
  22.    <td align="CENTER" class="LL"><xsl:value-of select="SURV"/></td>
  23.    <td align="CENTER" class="LL"><xsl:value-of select="GARANTIE"/></td>
  24.    <td align="RIGHT" class="LL"><xsl:value-of select="REGLEM"/></td>
  25.    <td align="RIGHT" class="LL"><xsl:value-of select="EVAL"/></td>
  26.    <td align="RIGHT" class="LL"><xsl:value-of select="RECOURS"/></td>
  27.    <td align="RIGHT" class="LL"><xsl:value-of select="EVALREC"/></td>
  28.    </tr>
  29.   </xsl:for-each>
  30.  </xsl:for-each>


 
Pb: je ne pe pas utiliser REQUETE2/ROWSET/ROW car j'ai defini "l'adresse de départ du fichier" comme DOCUMENT/REQUETE/ROWSET/ROW
 
je dois boucler sur le nombre de Row de la requete 1 tout en ayant acces aux infos de la requete 2

Reply

Marsh Posté le 08-07-2003 à 14:35:27    

En fait il suffisait de préfixer tout...  :whistle:  
Utiliser /DOCUMENT/REQUETE2/ROWSET/ROW qui prime sur la valeur choisi en template...
 
 
Je sors...  :D

Reply

Marsh Posté le 09-07-2003 à 10:42:49    

Du nouveau...
 
bon le premier probleme est résolu mais j'en ai un autre sur les bras qui est a peu pres identique
 
je dois afficher les résultats de ma requete 1 et les résultats de la requete 2 correspondants
 
donc je fais une petite condition dans l'affichage:
 

Code :
  1. for-each select="/DOCUMENT/REQUETE2/ROWSET/ROW[/DOCUMENT/REQUETE2/ROWSET/ROW/NUMCONTR=/DOCUMENT/REQUETE1/ROWSET/ROW/NUMCONT]


 
ce qui se passe? le test est considéré comme toujours faux (cad il n ya aucune correspondance alors qu en réalité il y en a)
 
quel est le probleme?
est ce que le prefixage du chemin d acces ne marche pas ici?
est ce que je n'ai pas le droit de faire des conditions sur des éléments? (oui ce ne sont pas des attributs)
quoi d autre?
 
à l'aide

Reply

Marsh Posté le 09-07-2003 à 11:17:27    

bon apparement c t le fait que ce soit des éléments que ca deconnait
le pb maitenant c que je compare deux éléments différents, mais ceux ci doivent etre comparé plusieurs fois
 
exemple: je dois savoir quels sont les éléments de requete2 correspondant à l'élément de requete1 trouvé :X
je dois parcourir tout les éléments de requete2 pour faire les comparaisons
mais si j utilise un for-each, je perd la localisation de X et je ne fais plus le test voulu mais seulement avec le premier élément de requete1 car j aurai du donner le chemin complet...  :pt1cable:  
 
le pb vient donc du fait que je dois parcourir 2 éléments différents d'un fichier xml, donc j'utilise le for-each, mais celui-ci ne peut garder qu une seule localisation (comme template match="..." )
comment faire?
 
qqun a t il une idée pour résoudre ce casse tete?
 

Code :
  1. <xsl:for-each select="DOCUMENT/REQUETE/ROWSET/ROW">
  2.  <tr>
  3.   <td align="CENTER"><xsl:value-of select="NUMCONT"/></td>
  4.   <td align="CENTER" class="LL"><xsl:value-of select="REFPROD"/></td>
  5.   <td align="RIGHT" class="LL"><xsl:value-of select="PRANN"/></td>
  6.   <td align="CENTER" class="LL"><xsl:value-of select="POSITION"/></td>
  7.   <xsl:if test="not(/DOCUMENT/REQUETE2/ROWSET/ROW)"> METTRE DES ESPACES </xsl:if> //si requete2 vide
  8.   <xsl:if test="/DOCUMENT/REQUETE2/ROWSET/ROW/NUMCONTR!=NUMCONT"> METTRE DES ESPACES </xsl:if> //si pour requete1 donné il ne correspond pas de requete2
  9.   <xsl:if test="/DOCUMENT/REQUETE2/ROWSET/ROW">
  10.    <xsl:if test="/DOCUMENT/REQUETE2/ROWSET/ROW/NUMCONTR=NUMCONT">
  11. //si pour requete1 donné il existe des valeurs de requete2, on les écrit
  12.     <td align="CENTER" class="LL"><xsl:value-of select="/DOCUMENT/REQUETE2/ROWSET/ROW/NUMSIN"/></td>
  13.     <td align="CENTER" class="LL"><xsl:value-of select="/DOCUMENT/REQUETE2/ROWSET/ROW/SURV"/></td>
  14.     <td align="CENTER" class="LL"><xsl:value-of select="/DOCUMENT/REQUETE2/ROWSET/ROW/GARANTIE"/></td>
  15.     <td align="RIGHT" class="LL"><xsl:value-of select="/DOCUMENT/REQUETE2/ROWSET/ROW/REGLEM"/></td>
  16.     <td align="RIGHT" class="LL"><xsl:value-of select="/DOCUMENT/REQUETE2/ROWSET/ROW/EVAL"/></td>
  17.     <td align="RIGHT" class="LL"><xsl:value-of select="/DOCUMENT/REQUETE2/ROWSET/ROW/RECOURS"/></td>
  18.     <td align="RIGHT" class="LL"><xsl:value-of select="/DOCUMENT/REQUETE2/ROWSET/ROW/EVALREC"/></td>
  19.    </xsl:if>
  20.   </xsl:if>


 
Edit: avec le code c mieux...
oui mais pas tres clair...
voila c mieux...


Message édité par hop le fou le 09-07-2003 à 11:25:56
Reply

Marsh Posté le 09-07-2003 à 11:30:37    

Donne un exemple clair/concis de ce que tu voudrais, ton xml en entrée et le tableau en sortie!
 
J'ai suivis la discussion mais j'ai toujours pas compris comment sont reliées les requetes 1 et 2...
 
 
 
 


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

Marsh Posté le 09-07-2003 à 12:03:19    

Avander a écrit :

Donne un exemple clair/concis de ce que tu voudrais, ton xml en entrée et le tableau en sortie!
 
J'ai suivis la discussion mais j'ai toujours pas compris comment sont reliées les requetes 1 et 2...
 


 
la requete 1 renvoie des contrats d'assurance(numéro...)
la requete 2 renvoie les sinistres correspondant a un contrat (il peut y avoir 0 a n contrats)
 

Code :
  1. requete1:
  2. <REQUETE>
  3. <ROWSET>
  4. <ROW num="1">
  5.   <NUMCONT>1A0004766</NUMCONT>
  6.   <REFPROD>AUTOCLA</REFPROD>
  7.   <PRANN>686.2</PRANN>
  8.   <POSITION>En Cours</POSITION>
  9. </ROW>
  10. <ROW num="2">
  11.   <NUMCONT>1A0004770</NUMCONT>
  12.   <REFPROD>AUTOCLA</REFPROD>
  13.   <PRANN>592.49</PRANN>
  14.   <POSITION>En Cours</POSITION>
  15. </ROW>
  16. ...
  17. </ROWSET>
  18. </REQUETE>
  19. requete2
  20. <REQUETE2>
  21. <ROWSET>
  22. <ROW num="1">
  23.   <NUMSIN>02205864</NUMSIN>
  24.   <NUMCONTR>1A0004770</NUMCONTR>
  25.   <SURV>10/05/2002</SURV>
  26.   <REGLEM>959.57</REGLEM>
  27.   <EVAL>959.57</EVAL>
  28.   <RECOURS>0</RECOURS>
  29.   <EVALREC>0</EVALREC>
  30.   <GARANTIE>DAAF</GARANTIE>
  31. </ROW>
  32. <ROW num="2">
  33.   <NUMSIN>02205864</NUMSIN>
  34.   <NUMCONTR>1A0004770</NUMCONTR>
  35.   <SURV>10/05/2002</SURV>
  36.   <REGLEM>0</REGLEM>
  37.   <EVAL>0</EVAL>
  38.   <RECOURS>0</RECOURS>
  39.   <EVALREC>0</EVALREC>
  40.   <GARANTIE>DRPJ</GARANTIE>
  41. </ROW>
  42. </ROWSET>
  43. </REQUETE2>


 
comme on pe le voir, pour le premier contrat il n ya pas eu de sinistres
pour le 2eme il y en a eu 2
 
je voudrais afficher les infos comme ca:
 
Contrat 1A0004766  
Contrat 1A0004770 Sinistre 02205864 Valeurs suivantes
                  Sinistre 02205864 Valeurs suivantes
...

Reply

Marsh Posté le 09-07-2003 à 12:26:56    

Et ton tableau tu le veux comment? Comme ceci?
 


<table>
<tr><td>REQUETE1</td><td>REQUETE2a<BR />REQUETE2a<BR /></td>
</table>


 
 


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

Marsh Posté le 09-07-2003 à 12:31:05    

Avander a écrit :

Et ton tableau tu le veux comment? Comme ceci?
 


<table>
<tr><td>REQUETE1</td><td>REQUETE2a<BR />REQUETE2a<BR /></td>
</table>


 
 
 


non pas tout a fait
<table>
 <tr>
  <td>Requete1</td><td>Requete2</td>
  <td> </td><td>Requete2</td>
 </tr>
</table>
 
en gros chaque sinistre doit apparaitre sur une ligne différente
je suis obligé de remplir des cases avec des espaces pour respecter les traits du tableau

Reply

Marsh Posté le 09-07-2003 à 12:31:05   

Reply

Marsh Posté le 09-07-2003 à 12:54:29    

J'ai pondu une solution vite fait pcq. je commence à avoir faim ;-):
 


<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<DOCUMENT>
  <REQUETE>
   <ROWSET>
     <ROW num="1">
      <NUMCONT>1A0004766</NUMCONT>
      <REFPROD>AUTOCLA</REFPROD>
      <PRANN>686.2</PRANN>
      <POSITION>En Cours</POSITION>
     </ROW>
     <ROW num="2">
      <NUMCONT>1A0004770</NUMCONT>
      <REFPROD>AUTOCLA</REFPROD>
      <PRANN>592.49</PRANN>
      <POSITION>En Cours</POSITION>
     </ROW>
   </ROWSET>
  </REQUETE>
  <REQUETE2>
   <ROWSET>
     <ROW num="1">
      <NUMSIN>02205864</NUMSIN>
      <NUMCONTR>1A0004770</NUMCONTR>
      <SURV>10/05/2002</SURV>
      <REGLEM>959.57</REGLEM>
      <EVAL>959.57</EVAL>
      <RECOURS>0</RECOURS>
      <EVALREC>0</EVALREC>
      <GARANTIE>DAAF</GARANTIE>
     </ROW>
     <ROW num="2">
      <NUMSIN>02305864</NUMSIN><!-- changé no !! -->
      <NUMCONTR>1A0004770</NUMCONTR>
      <SURV>10/05/2002</SURV>
      <REGLEM>0</REGLEM>
      <EVAL>0</EVAL>
      <RECOURS>0</RECOURS>
      <EVALREC>0</EVALREC>
      <GARANTIE>DRPJ</GARANTIE>
     </ROW>
   </ROWSET>
  </REQUETE2>
</DOCUMENT>
<!-- 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"
  xmlns="http://www.w3.org/1999/xhtml">
 
<!-- general settings -->
 
  <xsl:output
    method="xml" omit-xml-declaration="yes" indent="yes" encoding="ISO-8859-1"
    doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
    doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
 
  <xsl:strip-space elements="*"/>
 
  <xsl:decimal-format decimal-separator="," grouping-separator="."/>
 
<!-- parameters -->
  <xsl:param name="pLang" select="'fr'"/>
 
<!-- global variables -->
 
<!-- transformations -->
 
  <xsl:template match="/">
    <html xml:lang="{$pLang}" lang="{$pLang}">
      <head>
        <title>Tableau sinistre ;-)
        </title>
      </head>
      <body>
 
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>
 
  <xsl:template match="DOCUMENT">
    <table border="1">
      <xsl:apply-templates select="REQUETE/ROWSET/ROW"/>
    </table>
  </xsl:template>
 
  <xsl:template match="ROW">
    <xsl:variable name="vContrat"><xsl:value-of select="NUMCONT"/></xsl:variable>
    <tr>
      <td>Contrat: <xsl:value-of select="$vContrat"/></td>
      <td>Sinistres:
        <xsl:for-each select="//REQUETE2/ROWSET/ROW[NUMCONTR=$vContrat]">
          <xsl:value-of select="NUMSIN"/>
          <br />
        </xsl:for-each>
 
      </td>
    </tr>
  </xsl:template>
 
</xsl:stylesheet>
<!-- eof -->


 

le résultat HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xml:lang="fr" lang="fr" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Tableau sinistre ;-)
        </title>
</head>
<body>
<table border="1">
<tr>
<td>Contrat: 1A0004766</td>
<td>Sinistres:
        </td>
</tr>
<tr>
<td>Contrat: 1A0004770</td>
<td>Sinistres:
        02205864<br />02305864<br />
</td>
</tr>
</table>
</body>
</html>


 
Le tableau n'est pas exactement ce que tu veux ( mais je suis pas sur que ton dernier exemple est vraiment juste...)!
 
A+


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

Marsh Posté le 09-07-2003 à 14:46:23    

bon...
le fait d'utiliser une variable est une tres bonne idée: c meme ca que je cherchais en fait
pour le reste, comme je dois respecter un certain aspect graphique, je dois adapter l'idée a ma table
en tout cas merci  :jap:

Reply

Sujets relatifs:

Leave a Replay

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