| Auteur |
|
| Harleen |
|
| 8 Posts |
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)
|
|
| masseuro |
|
Sorry it's just me 422 Posts |
Bonjour,
je me permet de faire une citation venant d'un autre poste
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).
Je te remercie par avance de bien vouloir éditer ton message afin de le rendre conforme à cette règle.
ç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)
WANTED : Canard perdu, signe distinctif : il a 3 pattes
|
|
| Harleen |
|
| 8 Posts |
bonjour,
voilà, c'est modifié et indenté!!
|
|
| Gilles |
|
| 1002 Posts |
Bonjour!
Il y a une méthode un peu bourrin, mais elle devrait marcher
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><!--par exemple-->
</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><!--par exemple-->
<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)
Donne à une personne un poisson, elle se nourrira pendant un jour.
Apprends-lui à pêcher, elle se nourrira toute sa vie.
Kuan-Tseu
|
|
| Harleen |
|
| 8 Posts |
merci pour ta réponse, j'ai pu résoudre mon problème en passant par xslt 2.0
|
|
| Gilles |
|
| 1002 Posts |
Et comment as-tu fait?
Donne à une personne un poisson, elle se nourrira pendant un jour.
Apprends-lui à pêcher, elle se nourrira toute sa vie.
Kuan-Tseu
|
|
| Harleen |
|
| 8 Posts |
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
|
|