Bonjour à tous,

Je rencontre un problème lors de la création de mon fichier de transformation xsl pour passer d'un document XML à un autre document XML.
La structure de mon document XML source est assez simple, voici comment elle se présente :


<catalogue>
      <Prix_Detail>
         <Prix prixID="1502" Titre="Travaux préalables"/>
         <description>blabla</description>
         <UniteMesure UMID="MTK"/>
         <TauxTVA Taux="19.6" TVAID="VAT"/>
         <Nature NatureID="02" Titre="TRAVAUX PREPARATOIRES"/>
      </Prix_Detail>
      <Prix_Detail>
         <Prix prixID="2151" Titre="Installation de chantier"/>
         <description>blabla</description>
         <UniteMesure UMID="C62"/>
         <TauxTVA Taux="19.6" TVAID="VAT"/>
         <Nature NatureID="02" Titre="TRAVAUX PREPARATOIRES"/>
      </Prix_Detail>
      <Prix_Detail>
         <Prix prixID="9219  " Titre="Remblais"/>
         <description>Prix titre</description>
         <TauxTVA Taux="" TVAID=""/>
         <Nature NatureID="03" Titre="TERRASSEMENTS"/>
      </Prix_Detail>
      <Prix_Detail>
         <Prix prixID="9219a" Titre="Remblais" PrixParent="9219"/>
         <description>rblabla</description>
         <UniteMesure UMID="TNE"/>
         <TauxTVA Taux="19.6" TVAID="VAT"/>
         <Nature NatureID="03" Titre="TERRASSEMENTS"/>
      </Prix_Detail>
      <Prix_Detail>
         <Prix prixID="9219c" Titre="Remblais" PrixParent="9219"/>
         <description>blabla</description>
         <UniteMesure UMID="MTQ"/>
         <TauxTVA Taux="19.6" TVAID="VAT"/>
         <Nature NatureID="03" Titre="TERRASSEMENTS"/>
      </Prix_Detail>
      <Prix_Detail>
         <Prix prixID="5405" Titre="Protection d'étanchéité"/>
         <description>blabla</description>
         <UniteMesure UMID="MTK"/>
         <TauxTVA Taux="19.6" TVAID="VAT"/>
         <Nature NatureID="04" Titre="ASSAINISSEMENT - DRAINAGE"/>
      </Prix_Detail>
   </catalogue>


On peut voir que certains prix-detail ont la même nature, j'aimerais que dans ma transformation xsl, je regroupe ces prix qui ont une même nature, comme cela :
 
<catalogue>
   <groupe_prix nom="TRAVAUX PREPARATOIRES">
      <Prix_Detail>
         <Prix prixID="1502" Titre="Travaux préalables"/>
         <description>blabla</description>
         <UniteMesure UMID="MTK"/>
         <TauxTVA Taux="19.6" TVAID="VAT"/>
      </Prix_Detail>
      <Prix_Detail>
         <Prix prixID="2151" Titre="Installation de chantier"/>
         <description>blabla</description>
         <UniteMesure UMID="C62"/>
         <TauxTVA Taux="19.6" TVAID="VAT"/>
      </Prix_Detail>
    </groupe_prix>
    <groupe_prix nom="TERRASSEMENTS">
      <Prix_Detail>
         <Prix prixID="9219  " Titre="Remblais"/>
         <description>Prix titre</description>
         <TauxTVA Taux="" TVAID=""/>
      </Prix_Detail>
      <Prix_Detail>
         <Prix prixID="9219a" Titre="Remblais" PrixParent="9219"/>
         <description>rblabla</description>
         <UniteMesure UMID="TNE"/>
         <TauxTVA Taux="19.6" TVAID="VAT"/>
      </Prix_Detail>
      <Prix_Detail>
         <Prix prixID="9219c" Titre="Remblais" PrixParent="9219"/>
         <description>blabla</description>
         <UniteMesure UMID="MTQ"/>
         <TauxTVA Taux="19.6" TVAID="VAT"/>
         <Nature NatureID="03" Titre="TERRASSEMENTS"/>
      </Prix_Detail>
    </groupe_prix>
    <groupe_prix nom="ASSAINISSEMENT - DRAINAGE">
      <Prix_Detail>
         <Prix prixID="5405" Titre="Protection d'étanchéité"/>
         <description>blabla</description>
         <UniteMesure UMID="MTK"/>
         <TauxTVA Taux="19.6" TVAID="VAT"/>
      </Prix_Detail>
     </groupe_prix>
   </catalogue>
 

Comment est-il possible de faire ce type de regroupement?
J'ai réussi à créer ma balise groupe_prix en reprenant le nom de la nature de prix, mais celle-ci se rajoute avant chaque prix_detail, le regroupement n'est donc pas fait.

Si vous avez la moindre piste, je suis à l'écoute!
Merci d'avance
Modifié par Harleen (27 May 2009 - 12:03)
Bonjour,

je me permet de faire une citation venant d'un autre poste Smiley langue

Heyoan a écrit :

en tant que modérateur, je me dois de te faire remarquer que tu n'as malheureusement pas respecté l'une des Règles de base du forum qui est d'afficher les codes et exemples proprement à l'aide des boutons [ code]... ici ton code HTML, CSS, PHP, etc.[ /code] (sans espace).

upload/1-code.gif

Je te remercie par avance de bien vouloir éditer ton message afin de le rendre conforme à cette règle. Smiley cligne
Smiley smile


ça peut paraître idiot mais c'est tellement plus facile de t'aider ensuite (et en plus si tu pouvais indenter tes balises )

Merci à toi
Modifié par masseuro (27 May 2009 - 12:00)
Bonjour!

Il y a une méthode un peu bourrin, mais elle devrait marcher Smiley cligne

Si ta liste de titres ne change pas, tu peux pour chacun d'entre eux créer l'élément groupe_prix correspondant:

<xsl:element name="groupe_prix">
    <xsl:attribute name="titre">TERRASSEMENTS</xsl:attribute><!--[i]par exemple[/i]-->
</xsl:element>


Puis tu fais une boucle sur l'ensemble des éléments Prix_Detail possédant un élément-enfant Nature dont l'attribut Nature_ID vaut ce que tu veux:

<xsl:element name="groupe_prix">
    <xsl:attribute name="titre">TERRASSEMENTS</xsl:attribute><!--[i]par exemple[/i]-->
    <xsl:for-each select="//Prix_Detail/Nature[@Nature_ID='03']>
        (...)
    </xsl:for-each>
</xsl:element>


Tu peux même optimiser avec un template prenant comme paramètre le titre que tu veux:

<xsl:template name="groupes">
    <xsl:param name="titre"/>
    <xsl:element name="groupe_prix">
        <xsl:attribute name="titre"><xsl:value-of select="$titre" /></xsl:attribute>
        <xsl:for-each select="//Prix_Detail/Nature[@Titre=$titre]>
            (...)
        </xsl:for-each>
    </xsl:element>
</xsl:template>

Tu utilises ensuite le template:

<xsl:call-template name="groupes"><xsl:with-param name="titre" select="TRAVAUX PREPARATOIRES" /><xsl:call-template>
<xsl:call-template name="groupes"><xsl:with-param name="titre" select="TERRASSEMENTS" /><xsl:call-template>
<xsl:call-template name="groupes"><xsl:with-param name="titre" select="ASSAINISSEMENT - DRAINAGE" /><xsl:call-template>

... aux fautes de frappe que j'aurais pu faire près.
Modifié par Gilles (02 Jun 2009 - 09:19)
bonjour Gilles,

dans xslt 2.0, il y-a une balise qui s'appelle for-each-group, qui facilite justement cette notion de regroupement, j'ai cherché des exemples d'utilisation de cette balise, et voici le résultat :


<xsl:for-each-group select="Prix_Detail/Nature" group-by="@Titre">
				...
					<!--
						a l'interieur de chaque "regroupement", on cree les prix : ce sont les prix qui appartiennent au groupe 
					-->								
					<xsl:for-each select="current-group()">
						...				
															
				 	</xsl:for-each>										
			</xsl:for-each-group>



voila Smiley biggrin