[XML]-[XSL] Référence interfichiers

Référence interfichiers [XML]-[XSL] - XML/XSL - Programmation

Marsh Posté le 29-07-2005 à 11:58:59    

J'ai deux fichiers XML:
je voulais savoir comment faire pour parcourir deux fichiers XML à l'aide d'une même feuille de style
Mon but serait de parcourir mon premier fichier et à chaque élement récupérer son type contenu dans le
second fichier (dans Doc/TYPE/TResources/Attributes) puis à l'aide de cet attribut récupérer son type(Doc/TYPE).
 
exemple
--------------
on aura alors a l'affichage
        PModule
        Type=String
        Value=Module.xml
 
j'espère mettre bien exprimer et que quelqu'un peux m'éclairer.je suis en stage et ca bloque mon travail.
 
fichier1.xml
--------------------------------------------------------------------------------------
<Value>
   <PResources>
      <PModule Value="Module.xml"/>
      <PReference Value="RefFile.xml"/>
      <PTarget Value="RefTarget.xml"/>
      <PTolerance>
         <PPourcentageTolerance Value="5"/>
         <PToleranceMin Value="30"/>
         <PToleranceMax Value="80"/>
         <PPourcentageTolTemps Value="15"/>
      </PTolerance>
     
   </PResources>
</Value>
 
 
 
fichier2.xml
--------------------------------------------------------------------------------------
<Doc>
   <TYPE>
      <TModule Type="String"  Default="DicoMresIDataEn.xml"/>
      <TReference Type="String"  Default="RefFileTransmitter.xml"/>
      <TTarget Type="String"  Default="RefFileTarget.xml"/>
      <TPourcentageTolerance Type="Double"  Default="1.0" />
      <TPourcentageTolTemps Type="Double"  Default="2.0" />
      <TToleranceMax Type="Double"  Default="8" />
      <TToleranceMin Type="Double"  Default="35" />
      <TTolerance Type="Struct" >
         <attributes>
            <PPourcentageTolerance Type="TPourcentageTolerance"/>
            <PToleranceMin Type="TToleranceMin"/>
            <PToleranceMax Type="TToleranceMax"/>
            <PPourcentageTolTemps Type="TPourcentageTolTemps"/>
         </Attributes>
      </TTolerance>
       <TResources Type="Struct" Label="Ressources">
         <attributes>
            <PModule Type="TModule"/>
            <PReference Type="TReference"/>
            <PTarget Type="TTarget"/>
            <PTolerance Type="TTolerance"/>
          </Attributes>
      </TResources>
   </TYPE>
   <VAR>
      <PResources Type="TResources"/>
   </VAR>
</Doc>
--------------------------------------------------------------------------------------
voila ce que j'ai essayé de faire
 
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
 
 
<xsl:variable name="dico" select="document('fichier2.xml')"/>
 
 
<xsl:for-each select="Value//*">
        <xsl:variable name="p" select="name()"/>
                <xsl:value-of select ="$p"/>
        <br></br>
                 
        <xsl:for-each select="$dico/Dico/TYPEDEF/TResources/Attributes//*">
        <xsl:value-of select ="name()"/>
                <xsl:variable name="t" select="name()"/>
                <xsl:for-each select="@*">
                </xsl:for-each>        
                <xsl:value-of select ="$t"/>
                 
                 
         
                <xsl:if test="'$t'='$p'">
                        ...
                </xsl:if>
        </xsl:for-each>        
 
                   
</xsl:for-each>
 
 
 
</xsl:template>
</xsl:stylesheet>

Reply

Marsh Posté le 29-07-2005 à 11:58:59   

Reply

Marsh Posté le 29-07-2005 à 12:00:12    

C'est à peu près ça, via la variable dico tu peux récupérer ce que tu veux :)

Reply

Marsh Posté le 02-08-2005 à 10:57:08    

J'ai un autre problème. ma boucle pour le traitement des listes ne marche pas.
Je remets les codes
 
fichier1.xml
--------------------------------------------------------------------------------------

Code :
  1. <Value>
  2.    <PResources>
  3.       <PModule Value="Module.xml"/>
  4.       <PReference Value="RefFile.xml"/>
  5.       <PTarget Value="RefTarget.xml"/>
  6.       <PTolerance>
  7.          <PPourcentageTolerance Value="5"/>
  8.          <PToleranceMin Value="30"/>
  9.          <PToleranceMax Value="80"/>
  10.          <PPourcentageTolTemps Value="15"/>
  11.       </PTolerance>
  12.       <PList>
  13. <PTolerance>
  14.          <PPourcentageTolerance Value="5"/>
  15.          <PToleranceMin Value="30"/>
  16.          <PToleranceMax Value="80"/>
  17.          <PPourcentageTolTemps Value="15"/>
  18.         </PTolerance>
  19.         <PTolerance>
  20.          <PPourcentageTolerance Value="52"/>
  21.          <PToleranceMin Value="35"/>
  22.          <PToleranceMax Value="85"/>
  23.          <PPourcentageTolTemps Value="12"/>
  24.         </PTolerance>
  25.       <PList>
  26.     </PResources>
  27. </Value>


fichier2.xml
--------------------------------------------------------------------------------------

Code :
  1. <Doc>
  2.    <TYPE>
  3.       <TModule Type="String"  Default="DicoMresIDataEn.xml"/>
  4.       <TReference Type="String"  Default="RefFileTransmitter.xml"/>
  5.       <TTarget Type="String"  Default="RefFileTarget.xml"/>
  6.       <TPourcentageTolerance Type="Double"  Default="1.0" />
  7.       <TPourcentageTolTemps Type="Double"  Default="2.0" />
  8.       <TToleranceMax Type="Double"  Default="8" />
  9.       <TToleranceMin Type="Double"  Default="35" />
  10.       <TTolerance Type="Struct" >
  11.          <Attributes>
  12.             <PPourcentageTolerance Type="TPourcentageTolerance"/>
  13.             <PToleranceMin Type="TToleranceMin"/>
  14.             <PToleranceMax Type="TToleranceMax"/>
  15.             <PPourcentageTolTemps Type="TPourcentageTolTemps"/>
  16.          </Attributes>
  17.       </TTolerance>
  18.         <TList Type="List" Name="TTolerance"/>
  19. <TResources Type="Struct" Label="Ressources">
  20.          <Attributes>
  21.             <PModule Type="TModule"/>
  22.             <PReference Type="TReference"/>
  23.             <PTarget Type="TTarget"/>
  24.             <PTolerance Type="TTolerance"/>
  25.     <PList Type="TList">   
  26.  </Attributes>
  27.       </TResources>
  28.    </TYPE>
  29.    <VAR>
  30.       <PResources Type="TResources"/>
  31.    </VAR>
  32. </Doc>


 
--------------------------------------------------------------------------------------
voila ce que j'ai essayé de faire
j'ai un problème avec la gestion des listes.Ca ne rentre pas dans la boucle
 

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="/">
  4. <xsl:variable name="dico" select="document('DicoMsrDataEn.xml')"/>
  5. <HTML>
  6. <HEAD>
  7. <title>
  8. VALUE
  9. </title>
  10. </HEAD>
  11.   
  12. <BODY>
  13. <xsl:for-each select="Value//*">  
  14. <xsl:variable name="nomP" select="name()"/>  
  15.  
  16. <xsl:variable name="value" select="@Value"/>  
  17. <xsl:variable name="noeudType" select="$dico//*[name()=$nomP]"/>  
  18.  
  19. <!--fichier Dico-->  
  20.  <xsl:variable name="Type" select="$noeudType/@Type"/>
  21.  <xsl:variable name="selection" select="$dico//*[name()=$Type]"/>  
  22.  <xsl:variable name="type" select="$selection/@Type"/>
  23.  <xsl:variable name="label" select="$selection/@Label"/>
  24.  <xsl:variable name="unit" select="$selection/@Unit"/>
  25.  <xsl:variable name="Param" select="$selection/@Name"/>
  26.  
  27.  <xsl:if test="$type='String'">
  28.   <br></br>
  29.   <u><b><xsl:value-of select ="$label"/>:</b></u><xsl:value-of select ="$value"/>
  30.  </xsl:if>
  31.  <xsl:if test="$type='Double'">
  32.   <br></br>
  33.   <u><b><xsl:value-of select ="$label"/>:</b></u><xsl:value-of select ="$value"/><xsl:value-of select ="$unit"/>
  34.  </xsl:if>
  35.  
  36.  <xsl:if test="$type='Boolean'">
  37.   <br></br>
  38.   <u><b><xsl:value-of select ="$label"/>:</b></u><xsl:value-of select ="$value"/>
  39.  </xsl:if>
  40.  
  41.  <xsl:if test="$type='Integer'">
  42.   <br></br>
  43.   <u><b><xsl:value-of select ="$label"/>:</b></u><xsl:value-of select ="$value"/><xsl:value-of select ="$unit"/>
  44.  </xsl:if>
  45.  
  46.      
  47.  <xsl:if test="$type='List'">
  48.   <br></br>
  49.   <xsl:value-of select ="$Param"/>
  50.   <xsl:variable name="noeudList" select="Value//*[name()=$Param]"/>  
  51.    
  52.    <xsl:for-each select="$noeudList">  
  53.      <br></br>
  54.      
  55.    </xsl:for-each>
  56.  
  57.  </xsl:if>
  58.  
  59. </xsl:for-each>
  60. </BODY>
  61. </HTML>
  62.  
  63. </xsl:template>
  64. </xsl:stylesheet>

Reply

Marsh Posté le 02-08-2005 à 11:15:32    

Pourquoi tu essaies de pondre un seul template de la mort qui tue?  
 
Pourquoi ne pas décomposer le problème en sous-problèmes ( il faut diviser pour règner disait un illustre inconnu)... l'esprit XSLT c'est beaucoup de petits templates simples qui travaillent ensemble et produisent ainsi une solution à des problèmes complexes de façon simple et lisible...  
 
des gros templates truffé de for-each ça donne pas vraiment envie de s'y mettre...
 
 

Reply

Marsh Posté le 02-08-2005 à 11:59:52    

ok t'as raison
je vais essayer .

Reply

Marsh Posté le 02-08-2005 à 12:35:38    

<xsl:for-each select="Value//*">


 
Tu veux traiter tous les elements qui ont un attribut 'Value' ou je me plante?
 
détail pratique: les listing vaut mieux éviter le numérotage des lignes pcq. pour t'aider faut déjà se tapper le nettoyage du code  :sweat:
 
bon a savoir: dans la ligne 25 du premier xml la balise n'est pas fermée ( comme quoi le numérotage peut être pratique ;-)
 
ben oui c'est moi qui me plante... Value c'est le root de ton xml... le for-each est inutile à moins de vouloir brouiller les pistes... CQFD


Message édité par avander le 02-08-2005 à 12:47:53
Reply

Marsh Posté le 02-08-2005 à 13:51:22    

non en fait c pour parcourir toutes les balises, vu que je récupère leur type.

Reply

Marsh Posté le 02-08-2005 à 15:04:38    

Ben la bonne nouvelle c'est que ton stylesheet à bien l'air de fonctionner... une fois qu'on a réparé la balise PList à la ligne 25 du dico ( elle est pas fermée), j'obtiens un résultat ( pas très clair d'ailleurs) pour chaque balise PList y compris...  
 
Si tu nous donnais un exemple de ce que tu veux obtenir en sortie parce que sans cela il est difficile de juger si la façon dont tu t'y prends est valable...  
 

Reply

Marsh Posté le 02-08-2005 à 15:57:26    

Oui ca marche (j'avais essayé avant de poster le message)
Pour les type "double" et "string" on récupère et on affiche
bien la valeur.
mais la ou je bloque c'est pour le traitement  
du type "LIST".
Je veux crééer un tableau:
on aurait avec ca
<PList>      
     <PTolerance>
          <PPourcentageTolerance Value="5"/>
          <PToleranceMin Value="30"/>
          </PTolerance>
         <PTolerance>
          <PPourcentageTolerance Value="52"/>
          <PToleranceMin Value="35"/>
          </PTolerance>    
       <PList>    
 
un tableau du genre
 
           PPourcentageTolerance    PToleranceMin
PTolerance      5                          30
PTolerance      52                         35
 
La génération du tableau doit etre dependante des données
(le nommage des colonnes correspond aux balises et se fait  
automatiquement).
Voila ou je bloque

Reply

Marsh Posté le 02-08-2005 à 17:26:24    

La génération d'une table en fonction de la structure xml ne pose pas vraiment de problèmes ( c'est assez classique et tu trouveras des exemples en faisant qq recherchers sur HFR ou ailleurs...  
 
Avec l'approche 'push' ( le gros template qui doit s'occuper de tout) toutefois on tombe sur un os... une fois le tableau généré il va falloir éviter les 'enfants' de la liste dans la suite du traitement ( puisqu'ils figurent déjà dans le tableau)... donc en continuant dans cette voie il va falloir en plus pondre du code pour éviter ce problème...
 
est-ce que l'xml en entrée est fixe ou variable, dispose-t-il d'un schema ou une DTD? Si il est fixe rien n'empêche de l'éclater et d'écrire un stylesheet plus spécifique...  
 
 
 
 
 
 

Reply

Marsh Posté le 02-08-2005 à 17:26:24   

Reply

Marsh Posté le 02-08-2005 à 19:13:22    

L'XML en entrée est variable. Il ne dispose pas de schéma ni de DTD.
Tout comme toi, je me suis posé le problème des 'enfants' à  
éviter...

Reply

Sujets relatifs:

Leave a Replay

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