XML->XML via XSL traitement des attributs

XML->XML via XSL traitement des attributs - XML/XSL - Programmation

Marsh Posté le 20-01-2005 à 08:55:58    

Bonjour,
j'aimerai transformer un xml en un autre xml via xsl.
Là oû je coince, c'est pour lister à la suite tous les noeuds ayant un même attribut.
voici un exemple :
 
xml source :

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <aliments>
  3. <assiette NAME="poire" TYPE="fruit">
  4.  <note VALEUR="10"/>
  5. </assiette>
  6. <assiette NAME="pomme" TYPE="fruit">
  7.  <note VALEUR="13"/>
  8. </assiette>
  9. <assiette NAME="banane" TYPE="fruit">
  10.  <note VALEUR="8"/>
  11. </assiette>
  12. <assiette NAME="carotte" TYPE="legume">
  13.  <note VALEUR="1"/>
  14. </assiette>
  15. <assiette NAME="patate" TYPE="legume">
  16.  <note VALEUR="13"/>
  17. </assiette>
  18. <assiette NAME="biere" TYPE="liquide">
  19.  <note VALEUR="20"/>
  20. </assiette>
  21. </aliments>


 
et voici le xml que j'aimerai généré :

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <MENU NAME="recette">
  3. <MENU_ITEM NAME="fruit">
  4.  <MENU_ITEM NAME="pomme"/>
  5.  <MENU_ITEM NAME="poire"/>
  6.  <MENU_ITEM NAME="banane"/>
  7. </MENU_ITEM>
  8. <MENU_ITEM NAME="legume">
  9.  <MENU_ITEM NAME="carotte"/>
  10.  <MENU_ITEM NAME="patate"/>
  11. </MENU_ITEM>
  12. <MENU_ITEM NAME="liquide">
  13.  <MENU_ITEM NAME="biere"/>
  14. </MENU_ITEM>
  15. </MENU>


 
Quelqu'un connait l'instruction XSL qui va bien ??
 
merci


Message édité par deff le 31-01-2005 à 13:24:27
Reply

Marsh Posté le 20-01-2005 à 08:55:58   

Reply

Marsh Posté le 20-01-2005 à 09:33:54    

C'est une blague ?
T'as consulté la doc qui va bien ?  
Genre XPath

Reply

Marsh Posté le 20-01-2005 à 10:52:24    

gedeon a écrit :

C'est une blague ?
T'as consulté la doc qui va bien ?  
Genre XPath


 
Toi je sens que tu vas être désagréable lol.
 
Oui j'ai lu la doc xpath et j'avoue que c'est assez obscure (je débute).
 
Mon probleme est que je ne vois comment ne pas répéter
 <MENU_ITEM NAME="fruit">
 
sachant que je connais pas forcément la valeur de l'attribut TYPE.
 
Désolé si ma question parait trop simple mais sachez que j'ai quand même cherché dans mes bouquins avant de poster.


---------------
-->>C'est l'histoire d'un gars qui rêve qu'il mange de la guimauve.Il se réveille et il a plus d'oreiller.<<--
Reply

Marsh Posté le 20-01-2005 à 11:35:30    

select="aliment/assiette[@type='fruits']"
Par exemple pour selectionner les assiettes dont le type est fruit

Reply

Marsh Posté le 20-01-2005 à 12:04:43    

gedeon a écrit :

select="aliment/assiette[@type='fruits']"
Par exemple pour selectionner les assiettes dont le type est fruit


 
merci de ta réponse mais le problême est que je ne connais pas à l'avance la valeur de type (ici fruits).
 
une solution serait :

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
  3. <xsl:output method="xml" encoding="ISO-8859-1" indent="yes"/>
  4. <xsl:template match="/">
  5. <MENU NAME="recette">
  6. <xsl:apply-templates/>
  7. </MENU>
  8. </xsl:template>
  9. <xsl:template match="assiette">
  10. <xsl:variable name="mytype" select="@TYPE"/>
  11. <MENU_ITEM NAME="{$mytype}">
  12.  <xsl:if test="@TYPE=$mytype">
  13.  <MENU_ITEM NAME="{@NAME}"/>
  14.  </xsl:if>
  15. </MENU_ITEM>
  16. </xsl:template>
  17. </xsl:stylesheet>


 
mais là le noeud <MENU_ITEM NAME="fruit"> est répété
 
xml résultant :

Code :
  1. <?xml version="1.0" encoding="ISO-8859-1"?>
  2. <MENU xmlns:fo="http://www.w3.org/1999/XSL/Format" NAME="recette">
  3. <MENU_ITEM NAME="fruit">
  4.  <MENU_ITEM NAME="poire"/>
  5. </MENU_ITEM>
  6. <MENU_ITEM NAME="fruit">
  7.  <MENU_ITEM NAME="pomme"/>
  8. </MENU_ITEM>
  9. <MENU_ITEM NAME="fruit">
  10.  <MENU_ITEM NAME="banane"/>
  11. </MENU_ITEM>
  12. <MENU_ITEM NAME="legume">
  13.  <MENU_ITEM NAME="carotte"/>
  14. </MENU_ITEM>
  15. <MENU_ITEM NAME="legume">
  16.  <MENU_ITEM NAME="patate"/>
  17. </MENU_ITEM>
  18. <MENU_ITEM NAME="liquide">
  19.  <MENU_ITEM NAME="biere"/>
  20. </MENU_ITEM>
  21. </MENU>


 
rappel : xml voulu :

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <MENU NAME="recette">
  3. <MENU_ITEM NAME="fruit">
  4.  <MENU_ITEM NAME="pomme"/>
  5.  <MENU_ITEM NAME="poire"/>
  6.  <MENU_ITEM NAME="banane"/>
  7. </MENU_ITEM>
  8. <MENU_ITEM NAME="legume">
  9.  <MENU_ITEM NAME="carotte"/>
  10.  <MENU_ITEM NAME="patate"/>
  11. </MENU_ITEM>
  12. <MENU_ITEM NAME="liquide">
  13.  <MENU_ITEM NAME="biere"/>
  14. </MENU_ITEM>
  15. </MENU>


 
je sais pas si c'est clair !!??


---------------
-->>C'est l'histoire d'un gars qui rêve qu'il mange de la guimauve.Il se réveille et il a plus d'oreiller.<<--
Reply

Marsh Posté le 20-01-2005 à 14:15:15    

pas simple en effet  

Code :
  1. <xsl:template match="/aliments">
  2.         <xsl:for-each select="descendant::assiette/@TYPE[not(preceding::assiette/@TYPE = .)]">
  3.             <xsl:variable name="mytype" select="."/>
  4.             <xsl:value-of select="$mytype"/><br/>
  5.             <xsl:for-each select="//aliments/assiette[@TYPE=$mytype]">
  6.                 -<xsl:value-of select="@NAME"/><br/>
  7.             </xsl:for-each>
  8.             <br/>
  9.         </xsl:for-each>
  10.     </xsl:template>

Reply

Marsh Posté le 20-01-2005 à 16:30:04    

Merci Beaucoup,
ça marche nickel !!
 
 
Bon maintenant va falloir que j'étudie ton code car je ne comprends pas tout.

Reply

Marsh Posté le 21-01-2005 à 09:19:15    

C'est une double passe en quelques sorte.
Dans un premier temps je choppe les differents types puis je fais une requête pour chaque type!
Mefie toi , il se peut que selon l'ordre dans lequel vont se présenter tes assiettes, il y ai des doublons.  
Je m'explique il y a une comparaison de précédence, si jamais tu alternes les types , il se pourrait que ça ne fonctionne plus. Je n'ai pas eu le temsp de faire le test.


Message édité par gedeon le 21-01-2005 à 09:20:17
Reply

Marsh Posté le 31-01-2005 à 13:35:00    

gedeon a écrit :

C'est une double passe en quelques sorte.
Dans un premier temps je choppe les differents types puis je fais une requête pour chaque type!
Mefie toi , il se peut que selon l'ordre dans lequel vont se présenter tes assiettes, il y ai des doublons.  
Je m'explique il y a une comparaison de précédence, si jamais tu alternes les types , il se pourrait que ça ne fonctionne plus. Je n'ai pas eu le temsp de faire le test.


 
finalement ça ne marche pas exactement comme je le veux  :(  
C'est de ma faute, j'avais trop simplifier l'exemple donné.
 
le xml source serait plutot de cette gueule là :
 

Code :
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <aliments>
  3.     <monsieur NAME="chabert">
  4.          <assiette NAME="poire" TYPE="fruit">
  5.              <note VALEUR="10"/>
  6.          </assiette>
  7.          <assiette NAME="pomme" TYPE="fruit">
  8.              <note VALEUR="13"/>
  9.          </assiette>
  10.          <assiette NAME="banane" TYPE="fruit">
  11.              <note VALEUR="8"/>
  12.          </assiette>
  13.          <assiette NAME="carotte" TYPE="legume">
  14.              <note VALEUR="1"/>
  15.          </assiette>
  16.          <assiette NAME="patate" TYPE="legume">
  17.              <note VALEUR="13"/>
  18.          </assiette>
  19.          <assiette NAME="biere" TYPE="liquide">
  20.              <note VALEUR="20"/>
  21.          </assiette>
  22.      </monsieur>
  23.     <monsieur NAME="tartenpion">
  24.          <assiette NAME="poire" TYPE="fruit">
  25.              <note VALEUR="10"/>
  26.          </assiette>
  27.          <assiette NAME="pomme" TYPE="fruit">
  28.              <note VALEUR="1"/>
  29.          </assiette>
  30.          <assiette NAME="banane" TYPE="fruit">
  31.              <note VALEUR="18"/>
  32.          </assiette>
  33.          <assiette NAME="carotte" TYPE="legume">
  34.              <note VALEUR="14"/>
  35.          </assiette>
  36.          <assiette NAME="patate" TYPE="legume">
  37.              <note VALEUR="1"/>
  38.          </assiette>
  39.          <assiette NAME="biere" TYPE="liquide">
  40.              <note VALEUR="2"/>
  41.          </assiette>
  42.      </monsieur>
  43. </aliments>


 
et là le soucis c'est qu'on ne verra pas les assiettes de monsieur tartenpion car elles ont déja apparu chez monsieur chabert.
 
J'ai essayé pendant un moment de limiter le "not(preceding::assiette/@TYPE = .)" au noeud "monsieur" courant mais sans succès  :pfff:  
 
Désolé de resoliciter ton aide, mais je bloque...

Reply

Marsh Posté le 31-01-2005 à 13:49:55    

Chaud la !
Disons qu'en essayant de melanger les assietes !! et ensuite de faire la requete , ça devrai passer.
J'ai pas le temps de m'y pencher en fait, mais essaye !

Reply

Sujets relatifs:

Leave a Replay

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