Grouper des donnees par valeur d'une donnee
Bonjour,
j'ai un document XML qui contient une liste de documents de different type.
Je souhaite les grouper par la valeur de ce type or je n'arrive pas a utiliser cette fonction group-by car je dois lire le contenu de ma valeur, indiquée en rouge ci dessous.
Est-il aussi possible de créer un ordre dans le groupe, par exemple grouper d'abord "promoted", puis "tool", puis autre chose dans mon choix d'ordre ?
pour avoir en sortie
promoted:item1, item2, item4
tool:item3,item5,item6
Code:
1 2 3 4 5
|
<document>
<content name="thevalue">item1</content>
<content name="v_strType">promoted</content>
</document> |
mon document XML d'entree est le suivant
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
<?xml version="1.0" encoding="UTF-8"?>
<vce>
<document>
<content name="thevalue">item1</content>
<content name="v_strType">promoted</content>
</document>
<document>
<content name="thevalue">item2</content>
<content name="v_strType">promoted</content>
</document>
<document>
<content name="thevalue">item3</content>
<content name="v_strType">tool</content>
</document>
<document>
<content name="thevalue">item4</content>
<content name="v_strType">promoted</content>
</document>
<document>
<content name="thevalue">item5</content>
<content name="v_strType">tool</content>
</document>
<document>
<content name="thevalue">item6</content>
<content name="v_strType">tool</content>
</document>
<document>
<content name="thevalue">item7</content>
<content name="v_strType">promoted</content>
</document>
</vce> |
et mon code XSL est le suivant
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/vce">
<vce>
<xsl:for-each-group select="document" group-by="@v_strType">
<xsl:value-of select="current-grouping-key()"/>
POSITION : <xsl:value-of select="position()"/>
<xsl:value-of select="content[@name='thevalue']"/>
<xsl:value-of select="content[@name='v_strType']"/>
</xsl:for-each-group>
<!--
<xsl:for-each select="document">
<xsl:if test="( (content[@name='v_strType']='tool') ) ">
ecrire
</xsl:if>
</xsl:for-each>
-->
</vce>
</xsl:template>
</xsl:stylesheet> |
quelqu'un aurait-il une suggestion svp? merci
sinon j'ai encore cette option, mais elle relit tous les documents... tres mauvais code :(
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/vce">
<vce>
<xsl:for-each select="document">
<xsl:if test="( (content[@name='v_strType']='tool') ) ">
<xsl:value-of select="current-grouping-key()"/>
POSITION : <xsl:value-of select="position()"/>
<xsl:value-of select="content[@name='thevalue']"/>
<xsl:value-of select="content[@name='v_strType']"/>
</xsl:if>
</xsl:for-each>
<xsl:for-each select="document">
<xsl:if test="( (content[@name='v_strType']='promoted') ) ">
<xsl:value-of select="current-grouping-key()"/>
POSITION : <xsl:value-of select="position()"/>
<xsl:value-of select="content[@name='thevalue']"/>
<xsl:value-of select="content[@name='v_strType']"/>
</xsl:if>
</xsl:for-each>
</vce>
</xsl:template>
</xsl:stylesheet> |