[RESOLU] Index/Sommaire hiérarchique XML-XSL

Index/Sommaire hiérarchique XML-XSL [RESOLU] - XML/XSL - Programmation

Marsh Posté le 02-03-2009 à 22:47:57    

Bonjour,
 
Je Cherche à crée un sommaire qui se hiérarchise suivant les données du *.xml est sans doublon...
 
Cette section permet de connaitre l’endroit de la hiérarchisation.
<My> et mon niveau actuel
<Pere> et le niveau précédent
"Racine" et le niveau le plus bas du sommaire…
 

Code :
  1. <GED_Essais>
  2.      <Sommaire>
  3.           <My>Définition</My>
  4.           <Pere>Racine</Pere>
  5.      </Sommaire>
  6. </GED_Essais>


Le résultat que je recherche à avoir et d'utilisée la fonction si pour chaque nœud (../Sommaire/My) en fonction de (../Sommaire/pere)...
 
Mot (Pere : Racine/ My : mot)
Bv (Pere : Racine/ My : BV)  
     Auto (Pere : BV/ My : Auto)  
     Meca (Pere : BV/ My : Meca)  
          Auto (Pere : BV/ My : Meca)  
          Meca (Pere : BV/ My : Meca)
Mag (Pere : Racine/ My : mag)
Etc..
 
Voici les soucis que je rencontre :
 
1 – Malgré cette fonction
(<xsl:for-each select="//Sommaire[not(My = preceding-sibling::Sommaire/My)]"> ).
Les valeurs sont répétées et je vois pas ou j’ai pu me trompé ??
 
2 – Je trouve pas comment récupérer la valeur du nœud précédent !!!
 
Une partie de mon XML

Code :
  1. <GED>
  2.      <GED_Essais>
  3.           <Sommaire>
  4.                <My>Définition</My>
  5.                <Pere>Racine</Pere>
  6.           </Sommaire>
  7.           <Document>
  8.                <Nom>Définition C54</Nom>
  9.                <Type>Définition</Type>
  10.           </Document>
  11.      </GED_Essais>
  12.      <GED_Essais>
  13.            <Sommaire>
  14.                <My>Trame</My>
  15.                <Pere>Racine</Pere>
  16.           </Sommaire>
  17.           <Document>
  18.                <Nom>Définition C54</Nom>
  19.                <Type>Définition</Type>
  20.           </Document>
  21.      </GED_Essais>
  22.      <GED_Essais>
  23.           <Sommaire>
  24.                <My>Reglage</My>
  25.                <Pere>Trame</Pere>
  26.           </Sommaire>
  27.           <Document>
  28.                <Nom>Reglage C54</Nom>
  29.                <Type>Définition</Type>
  30.           </Document>
  31.      </GED_Essais>
  32. <GED>


 
Une partie de mon XSL

Code :
  1. <xsl:template name="BlockSommaire_01" match="/">
  2. <!--  Sommaire Niveau 1  -->
  3.   <xsl:for-each select="//Sommaire[not(My = preceding-sibling::Sommaire/My)]">
  4.     <xsl:sort select="My" order="ascending"/>
  5. <!--  Condition Niveau 1  -->
  6.       <xsl:if test="Pere = 'Racine'">
  7.         <xsl:call-template name="BlokSommNivauN01">
  8.         </xsl:call-template>
  9. <!--  Sommaire Niveau 2  -->
  10.           <xsl:for-each select="//Sommaire[not(My = preceding-sibling::Sommaire/My)]">
  11.             <xsl:sort select="My" data-type="number" order="ascending"/>
  12. <!--  Condition Niveau 2  -->
  13.               <xsl:if test="Pere = My">
  14.                 <xsl:call-template name="BlokSommNivauN02">
  15.                   </xsl:call-template>
  16.                 </xsl:if>
  17.             </xsl:for-each>
  18.         </xsl:if>
  19.     </xsl:for-each>
  20. </xsl:template>


<xsl:if test="Pere = My"> je sais pas comment develloper cette fonction sur une boucle precedente
Ma premier boucle De mon Index de niveau 1 (la racine)

Code :
  1. <xsl:template name="BlokSommNivauN01"> 
  2.     <table id="EnTete_V01">
  3.       <tbody>
  4.         <tr>
  5.           <td class="EnTete_Gauche"/>
  6.           <td class="EnTete_Centre">
  7.             <div>
  8.               <xsl:value-of select="My"/>
  9.             </div>
  10.           </td>
  11.           <td class="EnTete_Droite"/>
  12.         </tr>
  13.       </tbody>
  14.     </table>
  15.   </xsl:template>


Le résultat obtenu (le premier et le dernier devrait disparaitre, mais c'est pas le cas aussi)

Code :
  1. Définition       <!-- (Pere: Racine, My: Définition)-->
  2. Définition                 <!-- (Pere: Racine, My: Définition)-->
  3. Trame                     <!-- (Pere: Racine, My: Trame)-->
  4.      Essais                <!-- (Pere: Trame, My: Essais)-->
  5.      Reglage              <!-- (Pere: Trame, My: Reglage)-->
  6.      Reglage              <!-- (Pere: Trame, My: Reglage)-->


 
Merci de votre aide


Message édité par JojoSs75 le 11-10-2014 à 19:35:39
Reply

Marsh Posté le 02-03-2009 à 22:47:57   

Reply

Marsh Posté le 08-03-2009 à 10:25:58    

J'avance,
 
J'ai reussi à supprimer les doublons pour le premier niveau de mon Index/Sommaire:
Mais j'arrive pas àcrée mon niveau 2
 
Mon XML:

Code :
  1. <GED_ActiviteesEssais
  2.           SUBJECT="Test"
  3.           MySection="Banc d'Essais"
  4.           Pere="Racine">
  5.                <Document>
  6.                </Document>
  7.                <Redacteur>
  8.                </Redacteur>
  9.                <Infos>
  10.                </Infos>
  11.                <Recherche>
  12.                </Recherche>
  13.      </GED_ActiviteesEssais>


 
Mon XSL:

Code :
  1. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  2.    <xsl:output method="html" encoding="ISO-8859-1"/>
  3.    <xsl:template match="GED_JojoSs">
  4.       <html>
  5.          <body>
  6.             <table border="4">
  7.                <tr>
  8.                   <td>
  9.                      <xsl:call-template name="BlokSommNivauN01"/>
  10.                   </td>
  11.                </tr>
  12.             </table>
  13.          </body>
  14.       </html>
  15.    </xsl:template>
  16.    <xsl:template name="BlokSommNivauN01">
  17.       <xsl:for-each select="GED_ActiviteesEssais[not(@MySection = preceding-sibling::GED_ActiviteesEssais/@MySection)]">
  18.          <xsl:sort select="@MySection" order="ascending" data-type="text"/>
  19.          <xsl:if test="@Pere = 'Racine'">
  20.             <br id="RetourChariot"/>
  21.             <table border="2" id="EnTete_V01">
  22.                <tbody>
  23.                   <tr>
  24.                      <td class="EnTete_Gauche"/>
  25.                      <td class="EnTete_Centre">
  26.                         <xsl:value-of select="@MySection"/>
  27.                         <xsl:variable name="VarSomm01" select="@MySection"/>
  28.                         <xsl:call-template name="BlokSommNivauN02"/>
  29.                      </td>
  30.                      <td class="EnTete_Droite"/>
  31.                   </tr>
  32.                </tbody>
  33.             </table>
  34.          </xsl:if>
  35.       </xsl:for-each>
  36.    </xsl:template>
  37.    <xsl:template name="BlokSommNivauN02">
  38.       <xsl:for-each select="GED_ActiviteesEssais[not(@MySection = preceding-sibling::GED_ActiviteesEssais/@MySection)]">
  39.          <xsl:sort select="@MySection" order="ascending" data-type="text"/>
  40.          <xsl:if test="@Pere = $VarSomm01">
  41.             <br id="RetourChariot"/>
  42.             <table border="2" id="EnTete_V02">
  43.                <tbody>
  44.                   <tr>
  45.                      <td class="Marge"/>
  46.                      <td class="EnTete_Gauche"/>
  47.                      <td class="EnTete_Centre">
  48.                         <xsl:value-of select="@MySection"/>
  49.                         <xsl:call-template name="BlokSommNivauN03"/>
  50.                      </td>
  51.                      <td class="EnTete_Droite"/>
  52.                  </tr>
  53.                </tbody>
  54.             </table>
  55.          </xsl:if>
  56.       </xsl:for-each>
  57.    </xsl:template>


Mon message d'erreur

Code :
  1. Impossible de résoudre une référence à une variable ou un paramètre « VarSomm01 ». La variable ou le paramètre ne sont peut ...


 
Merci d'avance de m'orienter

Message cité 1 fois
Message édité par JojoSs75 le 08-03-2009 à 10:51:39
Reply

Marsh Posté le 08-03-2009 à 11:26:56    

JojoSs75 a écrit :


Mon message d’erreur

Code :
  1. Impossible de résoudre une référence à une variable ou un paramètre « VarSomm01 ». La variable ou le paramètre ne sont peut ...




J'ai réussi à effacer le messager d'erreur comme ceci:

Code :
  1. <xsl:if test="@Pere = '$VarSomm01'">


C’était juste un oubli de guillemet.
 
Par contre le niveau 2 n’apparaît pas ?!?
Etant débutant, je pense que ne vois pas quelle fonction me pourrait être utile, et que le code pourrait être allégé...
 
Merci de votre aide.

Reply

Marsh Posté le 08-03-2009 à 13:31:54    

En général en xslt on utilise très peu les for-each, les if et les call-template...
 
L'idée c'est plutôt de spécialiser des templates (et de jouer avec les modes)
 
Bref c'est pas trop ce que toi tu fais, à savoir :
- définissons un template qui match le père
- si tel test, alors call template A qui traite le fils
- sinon call template B qui traite le fils autrement
 
C'est plutôt :
- template qui match fils dont le père vérifie truc
- template qui match fils dont le père ne vérifie pas le truc
 
À coup de apply-templates on se déplace naturellement dans l'arbre XML. call-template c'est plutôt pour appeler un template nommé faisant un traitement sur autre chose que l'arbre XML (genre formatter une string, calculer un truc...)


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 08-03-2009 à 15:03:45    

Xavier_OM a écrit :


Bref c'est pas trop ce que toi tu fais, à savoir :  
- définissons un template qui match le père  
- si tel test, alors call template A qui traite le fils  
- sinon call template B qui traite le fils autrement  
 
À coup de apply-templates on se déplace naturellement dans l'arbre XML. call-template c'est plutôt pour appeler un template nommé faisant un traitement sur autre chose que l'arbre XML (genre formatter une string, calculer un truc...)


Bonjour Xavier_OM,
 
merci pour ta reponse, si je te comprend bien je devrais d'abort trier tous les fils et trier par peres! c'est bien ça?
La ou je bloc c'est comment trier les fils en fonction des peres?
As tu une piste STP?
Pouras t'on incrementer autant de fils que l'on veux?
 
Merci d'avance...


Message édité par JojoSs75 le 08-03-2009 à 16:21:04
Reply

Marsh Posté le 08-03-2009 à 18:47:39    

Je sais pas trop ce que tu veux, mais je dis que la bonne façon de faire du xslt c'est en écrivant :
 
<xsl:template match='Sommaire[Pere = "Racine"]/My'>
ou
<xsl:template match='My[parent::Sommaire[Pere = "Racine"]'>
 
pour 'matcher' les balises My des blocks ayant "Racine" comme Pere
 
Et pas call-template + if blablabla   [:spamafote]


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 08-03-2009 à 21:39:28    

En faite ce que je veux crée est un index automatique avec hiérarchisation.
Mon veux est que cette index ce génère tous seul suivant les données de la BDD, c'est pour ca que j'ai crée deux balises "My" et "Pere".
 
Mot                     (Pere : Racine :sol:  / My : mot)  
Bv                       (Pere : Racine :sol:  / My : BV :wahoo: )  
     Auto               (Pere : BV :wahoo:       / My : Auto)  
     Meca              (Pere : BV :wahoo:       / My : Meca :p )  
          Fiche         (Pere : Meca :p   / My : Fiche)  
          Calcul        (Pere : Meca :p   / My : Calcul)  
Mag                     (Pere : Racine :sol: / My : mag)  
 
La première boucle prend comme référence "racine" de la balise "Pere"
La deuxième boucle prend comme référence la balise "Pere" qui et la même que la balise "My" de la boucle précédente et ainsi de suite...
 
Je ne sais pas si c'est claire... Pour ca j'ai t'es redessinée mon arborescence avec a coté des balises un icone pour te situer le passage du "Pere" qui recherche la valeur de la balise "My" pour ce coller dessous avec un léger décalage.
 
Là ou je risque d'avoir un problème c'est de limité les doublons. Car j'aurais plusieurs fois le même block.
 
Merci


Message édité par JojoSs75 le 08-03-2009 à 21:59:59
Reply

Marsh Posté le 09-03-2009 à 10:42:57    

Rapidement ton truc je commencerai comme ça moi :
 

Code :
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3.     <xsl:output method="xml" encoding="utf-8"/>
  4.     <xsl:template match='/'>
  5.         <xsl:apply-templates select='//Sommaire[Pere="Racine"]'>
  6.             <xsl:with-param name='indent' select='0'/>
  7.         </xsl:apply-templates>
  8.     </xsl:template>
  9.     <xsl:template match='Sommaire'>
  10.         <xsl:param name='indent'/>
  11.         <xsl:variable name='current' select='My'/>
  12.         <!-- write the item with correct indentation -->
  13.         <xsl:call-template name='write-with-indentation'>
  14.             <xsl:with-param name='value'  select='$current'/>
  15.             <xsl:with-param name='indent' select='$indent'/>
  16.         </xsl:call-template>
  17.         <!-- process all elements that are sons of this item-->
  18.         <xsl:apply-templates select='../..//GED_Essais/Sommaire[Pere = $current]'>
  19.             <xsl:with-param name='indent' select='$indent + 4'/>
  20.         </xsl:apply-templates>
  21.     </xsl:template>
  22.     <xsl:template name='write-with-indentation'>
  23.         <xsl:param name='value'/>
  24.         <xsl:param name='indent'/>
  25.         <xsl:value-of select='concat($indent, " ", $value)'/>
  26.         <xsl:text>
  27. </xsl:text>
  28.     </xsl:template>
  29. </xsl:stylesheet>


 
Ça transforme cet XML :

Code :
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <GED>
  3.     <GED_Essais>
  4.         <Sommaire>
  5.             <My>Definition</My>
  6.             <Pere>Racine</Pere>
  7.         </Sommaire>
  8.     </GED_Essais>
  9.     <GED_Essais>
  10.         <Sommaire>
  11.             <My>Trame</My>
  12.             <Pere>Racine</Pere>
  13.         </Sommaire>
  14.     </GED_Essais>
  15.     <GED_Essais>
  16.         <Sommaire>
  17.             <My>Reglage1</My>
  18.             <Pere>Trame</Pere>
  19.         </Sommaire>
  20.     </GED_Essais>
  21.     <GED_Essais>
  22.         <Sommaire>
  23.             <My>Reglage2</My>
  24.             <Pere>Trame</Pere>
  25.         </Sommaire>
  26.     </GED_Essais>
  27.     <GED_Essais>
  28.         <Sommaire>
  29.             <My>Reglage5</My>
  30.             <Pere>Racine</Pere>
  31.         </Sommaire>
  32.     </GED_Essais>
  33. </GED>


 
en :

0 Definition
0 Trame
4 Reglage1
4 Reglage2
0 Reglage5


Chaque ligne sur l'output commence par un nombre qui est le degré d'indentation du truc (0 espaces, 4 espaces, 8 espaces...)
 
Bref faut lire :


Definition
Trame
    Reglage1
    Reglage2
Reglage5


 
 
Un autre truc pas tout à fait trivial qui pourra te servir (ou pas) : generate-id()
Je te mets un bout de code :
Xml :

Code :
  1. <depenses>
  2.     <depenses_row>
  3.         <nature>degradations</nature>
  4.         <annee>2001</annee>
  5.         <valdepense>58</valdepense>
  6.     </depenses_row>
  7.     <depenses_row>
  8.         <nature>portier</nature>
  9.         <annee>2001</annee>
  10.         <valdepense>150</valdepense>
  11.     </depenses_row>
  12.     <depenses_row>
  13.         <nature>portier</nature>
  14.         <annee>2002</annee>
  15.         <valdepense>200</valdepense>
  16.     </depenses_row>
  17. </depenses>


 
Résultat :  
http://img27.imageshack.us/img27/6193/toto.png
Pour obtenir ça on doit faire un parcours en largeur de l'arbre au lieu d'un classique parcours en profondeur, pour d'abord extraire les entetes de colonnes (uniques) puis ce qu'on va mettre dessous à chaque ligne.
 
Xslt :

Code :
  1. <?xml version="1.0"?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3.     <xsl:output method="html" encoding="ISO-8859-1"/>
  4.     <xsl:key name="annees" match="annee" use="."/>
  5.     <xsl:key name="natures" match="nature" use="."/>
  6.     <xsl:template match="/depenses">
  7.         <table border="1">
  8.             <!-- Generation de la ligne d'en-tete -->
  9.             <tr>
  10.                 <td>Natures</td>
  11.                 <xsl:for-each select="/depenses/depenses_row/annee[generate-id(.) = generate-id(key('annees',.)[1])]">
  12.                     <td><xsl:value-of select="."/></td>
  13.                 </xsl:for-each>
  14.             </tr>
  15.             <!-- Generation des lignes de nature -->
  16.             <xsl:for-each select="depenses_row/nature[generate-id(.) = generate-id(key('natures',.)[1])]">
  17.                 <xsl:variable name="var-nature" select="."/>
  18.                 <tr>
  19.                     <td><xsl:value-of select="."/></td>
  20.                     <xsl:for-each select="/depenses/depenses_row/annee[generate-id(.) = generate-id(key('annees',.)[1])]">
  21.                         <td><xsl:value-of select="/depenses/depenses_row[annee = current() and nature = $var-nature]/valdepense"/></td>
  22.                     </xsl:for-each>
  23.                 </tr>
  24.             </xsl:for-each>
  25.         </table>
  26.     </xsl:template>
  27. </xsl:stylesheet>


 
Cette technique se nomme "muenchian method", c'est une façon de contourner une limitation de xslt 1.1 quand on veut trouver l'union de plusieurs éléments (l'équivalent unix d'un grep "balise" | sort | uniq)
http://www.jenitennison.com/xslt/g [...] chian.html
 
 
 :o


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 09-03-2009 à 20:48:46    

Xavier_OM a écrit :


Rapidement ton truc je commencerai comme ça moi :
 
...
 
Cette technique se nomme "muenchian method", c'est une façon de contourner une limitation de xslt 1.1 quand on veut trouver l'union de plusieurs éléments (l'équivalent unix d'un grep "balise" | sort | uniq)
 
 :o  


 
Oulàlà....
 
Vas me falloir du temps pour tous comprendre...
 
Merci beaucoup Xavier_OM
 
Je vais pouvoir tester les deux méthodes...
plus ça vas plus je trouve le XML puissant (finalement j'ai fais le bon choix)


Message édité par JojoSs75 le 09-03-2009 à 20:51:46
Reply

Marsh Posté le 12-03-2009 à 21:11:13    

Xavier_OM a écrit :

Rapidement ton truc je commencerai comme ça moi :
 

0 Definition
0 Trame
4 Reglage1
4 Reglage2
0 Reglage5


Chaque ligne sur l'output commence par un nombre qui est le degré d'indentation du truc (0 espaces, 4 espaces, 8 espaces...)
 :o


Merci xavier,
 
ça marche, enfin une hiérarchie correcte  :bounce:  
Voici ce que ca donne

0 Banc d'Essais
4 Notice
4 Trame  
4 Trame                      :(  
4 Notice                    :(  
0 Boite de Vitesses
0 Moteur
4 Entretiens
0 Vieillissement
4 Diesel
4 Essence
8 Cycles
8 Cycles                     :(  
8 Définition


 
Juste Quelques questions...
1) Pourquoi utilisée (<xsl:apply-templates select='../..//GED_Essais/Sommaire[Pere = $current]'> ) c'est le (select='../..//GED_Essais/Sommaire) qui me bloque et pourquoi pas select='//GED_Essais/Sommaire . Cette question est peut-être bête mais le xsl est plus une envie d'apprendre que mon métier premier.
2) comment on fait pour supprimer les doublons dans cette méthode?!?
Dans ce que j'avais crée en copient sur un model, j'avais utilisé:

Code :
  1. <xsl:for-each select="//Sommaire[not(My = preceding-sibling::Sommaire/My)]">  
  2.     <xsl:sort select="My" order="ascending"/>


et vu la réponse que tu avais donner je sais plus ver ou aller  :cry:  

Xavier_OM a écrit :

En général en xslt on utilise très peu les for-each, les if et les call-template...  
 
L'idée c'est plutôt de spécialiser des templates (et de jouer avec les modes)


Reply

Marsh Posté le 12-03-2009 à 21:11:13   

Reply

Marsh Posté le 13-03-2009 à 10:26:35    

JojoSs75 a écrit :


1) Pourquoi utilisée (<xsl:apply-templates select='../..//GED_Essais/Sommaire[Pere = $current]'> ) c'est le (select='../..//GED_Essais/Sommaire) qui me bloque et pourquoi pas select='//GED_Essais/Sommaire .  


 
 
// est un raccourci pour descendant-or-self::, c'est à dire "context node + descendants of this context node"
.. est un raccourci pour parent::, c'est à dire "parent of context node"
apply-templates, contrairement à call-template, change le nœud courant (on se déplace de nœuds en nœuds quand on fait des apply-templates)
 
Donc //, contrairement à ce que tu penses, ne part pas de la racine du document pour aller partout, il part du nœud courant.  
Mais en effet si tu ne fais que des call-template, tu ne déplaces jamais ton noeud courant qui reste donc '/' du début à la fin, auquel cas // se comportera bien comme tu penses.
 
 
En écrivant ../../GED_Essais/Sommaire[condition] je remonte de 2 étages à partir du nœud courant donc... se déplacer dans le xml c'est comme se déplacer dans ton explorateur de fichiers (qui est aussi une arborescence), on remonte de 2 crans puis on redescend ailleurs.
 
 

JojoSs75 a écrit :


2) comment on fait pour supprimer les doublons dans cette méthode?!?


?


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 14-03-2009 à 00:52:49    

Salut Xavier

Xavier_OM a écrit :

// est un raccourci pour descendant-or-self::, c'est à dire "context node + descendants of this context node"
.. est un raccourci pour parent::, c'est à dire "parent of context node"
apply-templates, contrairement à call-template, change le nœud courant (on se déplace de nœuds en nœuds quand on fait des apply-templates)

Merci pour cette reponse claire.

Xavier_OM a écrit :

2) comment on fait pour supprimer les doublons dans cette méthode?!?
 
?


 
Plour etre plus claire j'utilise mon xml comme base de connaissances, est plour ceci j'ai une page avec toutes mes node.
 
la page que tu m'as aidé a crée vas me permetre de filtrer par categories comme ci dessous:
0 Banc d'Essais  
4         Notice  
4         Trame  

4       Trame                            :(  
4       Notice                            :(  

0 Boite de Vitesses  
0 Moteur  
4         Entretiens  
0 Vieillissement  
4         Diesel  
4         Essence  
8                 Cycles

8              Cycles                     :(  
8                 Définition
 
Mais comme tu vois:
Trame apparais deux fois, si j'ai 20 trames ils apparaitrons 20 fois :cry:  
tous comme Notice et Cycles :??:
 

Xavier_OM a écrit :

En général en xslt on utilise très peu les for-each, les if et les call-template...  
   
L'idée c'est plutôt de spécialiser des templates (et de jouer avec les modes) [/b]


Encore une derniere si tu n'utilise pas les if je suposse que tu les remplaces par des choise?
Mon but future apres avoir résolut les doublons et de crée la mise en forme suivant le resultat de ($indent) rediriger vers un template doubler d'un css.


Message édité par JojoSs75 le 14-03-2009 à 10:16:10
Reply

Marsh Posté le 14-03-2009 à 12:00:06    

File un exemple de xml qui te donne plusieurs entrées identiques, histoire de voir. (à mon avis faut jouer avec les formes muenchiennes)
 
Et non, if et choose c'est pareil, on utilise ni l'un ni l'autre :D On définit des templates très précis (avec des xpath assez évolués pour ne matcher qu'un seul cas)


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 14-03-2009 à 12:50:48    

merci de tes réponse

Xavier_OM a écrit :

File un exemple de xml qui te donne plusieurs entrées identiques, histoire de voir. (à mon avis faut jouer avec les formes muenchiennes)

formes muenchiennes??? :(  
faut ue fasse des recherche sur cette nouvelle forme

Xavier_OM a écrit :

Et non, if et choose c'est pareil, on utilise ni l'un ni l'autre :D On définit des templates très précis (avec des xpath assez évolués pour ne matcher qu'un seul cas)

Ok pour la reponse... je pense que je vais m'en sortir sans trop de PB :)

Reply

Marsh Posté le 15-03-2009 à 00:08:37    

Xavier_OM a écrit :

File un exemple de xml qui te donne plusieurs entrées identiques, histoire de voir. (à mon avis faut jouer avec les formes muenchiennes)


 :bounce: J'ai trouvé "Muenchiennes" c'est la fonction "key"
 :cry: Impossible d'utiliser des variables dans cette expression.
 
Apres avoir passé mon samedi à cherché, j'ai ma tete comme une pasteck...
du coup j'hesite entre "generate-id" & "Key" et je vois toujours pas comment faire pour la suite...

Reply

Marsh Posté le 15-03-2009 à 00:37:37    

Jte ferai remarquer que j'ai posté un exemple de muenchian method l'autre jour :o


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 15-03-2009 à 09:41:49    

Xavier_OM a écrit :

Jte ferai remarquer que j'ai posté un exemple de muenchian method l'autre jour :o


OUI, j'ai vus ça, et je te remercie. Ce qui m’a bloquer c’était ta phase :

Un autre truc pas tout à fait trivial qui pourra te servir (ou pas) : generate-id()


 
Mon PB est de le positionner dans un premier temps.
 
J'ai pensé reprendre :

Code :
  1. <xsl:template name='write-with-indentation'>
  2.     <xsl:param name='value'/>
  3.     <xsl:param name='indent'/>
  4.     <xsl:value-of select='concat(" - ",$indent, " ", $value," - " )'/>
  5.     <xsl:text></xsl:text>
  6. </xsl:template>


En quelque chose comme ceci:

Code :
  1. <xsl:key name="valueS" match="Sommaire/My" use="."/>
  2. <xsl:template name='write-with-indentation3'>
  3.     <xsl:param name='value'/>
  4.     <xsl:param name='indent'/>
  5.     <!-- Génération des lignes de nature -->
  6.     <xsl:for-each select="Sommaire/My[generate-id(.) = generate-id(key('valueS',.)[1])]">
  7.         <tr>
  8.             <td>
  9.                 <xsl:value-of select='concat(" - ",$indent, " ", $valueS," - " )'/>
  10.             </td>
  11.             <xsl:text></xsl:text>
  12.         </tr>
  13.     </xsl:for-each>
  14. </xsl:template>


Je sais que ce n’est pas comme ça...
Mais je tourne en rond... Et j'arrive pas à mixé tes deux exemples... :cry:  
La seule certitude que j’ai c’est que le traitement ce fait dans le Template "write-with-indentation"
Mais je ne vois pas du tout comment utiliser "value"…
 
Peux-tu m'aider en me disant quel "template" changer... STP
Et le lien avec $value, je tourne en rond,
 
Merci d’avance
 
Nota: la seul notion de xml/xsl que j'ai c'est de l'autodidacte... et ce que je fait est personnel.

Message cité 1 fois
Message édité par JojoSs75 le 15-03-2009 à 09:58:20
Reply

Marsh Posté le 15-03-2009 à 12:05:14    

JojoSs75 a écrit :


OUI, j'ai vus ça, et je te remercie. Ce qui m’a bloquer c’était ta phase :

Un autre truc pas tout à fait trivial qui pourra te servir (ou pas) : generate-id()


 
Nota: la seul notion de xml/xsl que j'ai c'est de l'autodidacte... et ce que je fait est personnel.


 
xslt est une technologie pas facile à aborder :/
Même si c'est un bon outil pour transformer du xml, ce n'est pas forcément le bon outil pour toi si tu n'as pas le niveau pour t'en servir.  
 
Je ne dis pas ça méchamment, j'ai appris xslt en autodidacte moi aussi :), mais :
- l'informatique et la prog c'est mon métier
- j'ai fait du xslt au travail, donc j'étais dessus pendant plusieurs jours
- je pense qu'il m'a bien fallu une semaine pour comprendre le "truc" derrière Muench.
 
Bref ya pas de soucis, on va y arriver, mais selon le temps que tu y consacres et la ou les personnes qui vont maintenir ton code dans l'avenir, c'est peut-être un choix un peu "cryptique" que tu as fait  
 
 
Un exemple donc, si je reprends mon xlst posté plus haut et que j'ajoute un peu de "Muench" pour éviter les doublons.
 

Code :
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  3.     <xsl:output method="xml" encoding="utf-8"/>
  4.     <!-- une clef pour identifier les 'My' uniques en fonction de leur valeur texte -->
  5.     <xsl:key name="maClef" match="My" use="."/>
  6.     <xsl:template match='/'>                       
  7.         <xsl:apply-templates select='//Sommaire[Pere="Racine"]'>
  8.             <xsl:with-param name='indent' select='0'/>         
  9.         </xsl:apply-templates>                                 
  10.     </xsl:template>                                           
  11.     <!-- template des Sommaire "en général", qui ne fait rien -->
  12.     <!-- on va définir un autre template qui va s'occuper des Sommaire ayant un My unique -->
  13.     <!-- les Sommaire ne répondant pas aux critères de l'autre template finiront donc ici -->
  14.     <xsl:template match='Sommaire'/>
  15.     <!-- le template des Sommaire ayant un My unique -->
  16.     <xsl:template match='Sommaire[My[generate-id(.) = generate-id(key("maClef",.)[1])]]'>
  17.         <xsl:param name='indent'/>
  18.         <xsl:variable name='current' select='My'/>
  19.         <!-- write the item with correct indentation -->
  20.         <xsl:call-template name='write-with-indentation'>
  21.             <xsl:with-param name='value'  select='$current'/>
  22.             <xsl:with-param name='indent' select='$indent'/>
  23.         </xsl:call-template>
  24.         <!-- process all elements that are sons of this item-->
  25.         <xsl:apply-templates select='../../GED_Essais/Sommaire[Pere = $current]'>
  26.             <xsl:with-param name='indent' select='$indent + 4'/>
  27.         </xsl:apply-templates>
  28.     </xsl:template>
  29.     <xsl:template name='write-with-indentation'>
  30.         <xsl:param name='value'/>
  31.         <xsl:param name='indent'/>
  32.         <xsl:value-of select='concat($indent, " ", $value)'/>
  33.         <xsl:text>
  34. </xsl:text>
  35.     </xsl:template>
  36. </xsl:stylesheet>


 
En espérant que ça aide.


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 12-04-2009 à 21:35:26    

Xavier_OM a écrit :


xslt est une technologie pas facile à aborder :/
Même si c'est un bon outil pour transformer du xml, ce n'est pas forcément le bon outil pour toi si tu n'as pas le niveau pour t'en servir.  
 
Je ne dis pas ça méchamment, j'ai appris xslt en autodidacte moi aussi :), mais :
- l'informatique et la prog c'est mon métier
- j'ai fait du xslt au travail, donc j'étais dessus pendant plusieurs jours
- je pense qu'il m'a bien fallu une semaine pour comprendre le "truc" derrière Muench.
 
Bref ya pas de soucis, on va y arriver, mais selon le temps que tu y consacres et la ou les personnes qui vont maintenir ton code dans l'avenir, c'est peut-être un choix un peu "cryptique" que tu as fait  
 
Un exemple donc, si je reprends mon xlst posté plus haut et que j'ajoute un peu de "Muench" pour éviter les doublons.
 
En espérant que ça aide.


 
Merci beaucoup Xavier_OM,
 
Pas eu beaucoup de temps à moi pour le tester a fond...
 
mais OUI ça marche nickel... meme si j'ai encore un peux de mal a le reproduire pour l'instant...
 

Xavier_OM a écrit :

c'est peut-être un choix un peu "cryptique" que tu as fait


Surrement, mais meme etre curieur est ma marque de fabrique... :)
 
Problème résolu !  
JojoSs


Message édité par JojoSs75 le 12-04-2009 à 22:18:47
Reply

Sujets relatifs:

Leave a Replay

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