Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1397 connectés 

  FORUM HardWare.fr
  Programmation
  XML/XSL

  XML->XML via XSL traitement des attributs

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

XML->XML via XSL traitement des attributs

n°957096
deff
Monde de merde
Posté le 20-01-2005 à 08:55:58  profilanswer
 

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
mood
Publicité
Posté le 20-01-2005 à 08:55:58  profilanswer
 

n°957125
gedeon
Posté le 20-01-2005 à 09:33:54  profilanswer
 

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

n°957197
deff
Monde de merde
Posté le 20-01-2005 à 10:52:24  profilanswer
 

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.<<--
n°957261
gedeon
Posté le 20-01-2005 à 11:35:30  profilanswer
 

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

n°957291
deff
Monde de merde
Posté le 20-01-2005 à 12:04:43  profilanswer
 

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.<<--
n°957435
gedeon
Posté le 20-01-2005 à 14:15:15  profilanswer
 

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>

n°957589
deff
Monde de merde
Posté le 20-01-2005 à 16:30:04  profilanswer
 

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

n°958229
gedeon
Posté le 21-01-2005 à 09:19:15  profilanswer
 

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
n°966695
deff
Monde de merde
Posté le 31-01-2005 à 13:35:00  profilanswer
 

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...

n°966705
gedeon
Posté le 31-01-2005 à 13:49:55  profilanswer
 

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 !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  XML/XSL

  XML->XML via XSL traitement des attributs

 

Sujets relatifs
coloration syntaxique et traitement de texte[batch] - récupération du résultat d'une commande et traitement
Déclaration de namespace dans un XSLalgorithmie en traitement d'image
algorithmie en traitement d'image.. tout un programmeFaire un editeur de fichier XML en C#
[Java/SNMP] Convertion MIB/XML[Resolu] [xml] pb encodage
enregistrement de variables dans la BDD ou creation d'un fichier XML ?Diriger un flux XML vers un parseur XSLT
Plus de sujets relatifs à : XML->XML via XSL traitement des attributs


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR