Salut à tous !
Le XSL c’est magique, mais un peu comme les regexp, on chope un niveau de fou quand on pratique , et on oublie tout aussi vite.
Du coup, je galère à faire une opération et je me demande même si c’est possible en XSL.
Xml d’entrée :
<documents>
<doc-content name="a4">
<file-tag name="toto"/>
</doc-content>
<doc-content name="a5">
<file-tag name="tata"/>
</doc-content>
<doc-content name="a6">
<file-tag name="titi"/>
</doc-content>
<doc-content name="a7">
<file-tag name="toto"/>
</doc-content>
<doc-content name="a8">
<file-tag name="titi"/>
</doc-content>
</documents>
Xml voulu en sortie
<documents>
<folder name="toto">
<doc-content name="a4"/>
<doc-content name="a7">
</folder>
<folder name="tata">
<doc-content name="a5"/>
</folder>
<folder name="titi">
<doc-content name="a6"/>
<doc-content name="a8">
</folder>
</documents>
Je pense qu’en 2 passes c’est possible, mais en une passe, j’ai vraiment des doutes…
Des idées messieurs ?
Merci d’avance !
Yaltar
Juillet 16, 2009, 10:37
2
moi je dirais :
[code] <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version=« 2.0 » xmlns:xsl=« http://www.w3.org/1999/XSL/Transform » xmlns:xsi=« http://www.w3.org/2001/XMLSchema-instance » xmlns:xs=« XML Schema » xmlns:fn=« http://www.w3.org/2005/xpath-functions » exclude-result-prefixes=« fn xs xsi xsl »>
<xsl:output method=« xml »
indent=« yes »
omit-xml-declaration=« yes »/>
<xsl:template match="/documents">
<documents>
<xsl:for-each-group select="doc-content/file-tag"
group-by="@name">
<xsl:variable name="var_cur_result_groupby" as="xs:string" select="current-grouping-key()"/>
<folder>
<xsl:attribute name="name">
<xsl:value-of select="current-grouping-key()"/>
</xsl:attribute>
<xsl:for-each select="/documents/doc-content">
<xsl:if test="file-tag/@name=$var_cur_result_groupby">
<doc-content>
<xsl:attribute name="name">
<xsl:value-of select="@name"/>
</xsl:attribute>
</doc-content>
</xsl:if>
</xsl:for-each>
</folder>
</xsl:for-each-group>
</documents>
</xsl:template>
</xsl:stylesheet>[/code]
Voila monsieur
J’avoue que le <xsl:for-each select="/documents/doc-content"> est un peu violent mais bon
Impecc ! Ca marche nickel.
J’ai oublié de préciser que j’avais des contraintes XSLT 1, mais au final, j’ai switché mes libs Java pour du Saxon et porifter de la surpuissance du XSLT 2.
Merci Yaltar. Comme d’hab, tu roxx des poneys en short.