IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

Grouper des donnees par valeur d'une donnee


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier Avatar de yaya_la_rafale
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 92
    Points : 70
    Points
    70
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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>

  2. #2
    Membre régulier Avatar de yaya_la_rafale
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 92
    Points : 70
    Points
    70
    Par défaut reponse trouvée :)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?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/content[@name='v_strType']" group-by="text()">
    			<xsl:for-each select="current-group()">		
    			<xsl:if test="position() &lt; 4"> 
    			TYPE:<xsl:value-of select="current-grouping-key()"/> POSITION : <xsl:value-of select="position()"/>
    						<xsl:value-of select="document/content[@name='thevalue']"/>
    						<xsl:value-of select="document/content[@name='v_strType']"/>	
    						</xsl:if>
    			</xsl:for-each>					
    		</xsl:for-each-group>	
     
    		</vce>
    	</xsl:template>
    </xsl:stylesheet>

  3. #3
    Membre actif
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 199
    Points : 297
    Points
    297
    Par défaut
    ...juste une précision, on est bien d'accord que c'est du XSLT 2 et non 1 comme mis dans ton code ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    "Chuck Norris a déjà compté jusqu'à l'infini. Deux fois."

  4. #4
    Membre régulier Avatar de yaya_la_rafale
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 92
    Points : 70
    Points
    70
    Par défaut
    oui, c'est effectivement en version 2.

    et d'ailleurs je viens de me rendre compte que je dois utiliser du XML 1.0. donc tout est à refaire pour moi #pleurs#

    si qqun a une solution en XML 1.0. pour ce meme code car cette fonction for-each-group n'existe pas en XML 1.0.

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hello,

    Rassure-toi, ça n'a rien à voir.

    XML 1.0 est géré par toutes les versions de XSLT.
    XSLT existe en versions 1.0 et 2.0, et seul XSLT 2.0 gère for-each-group.

    Si tu as le droit d'utiliser XSLT 2.0 tout va bien, il gérera ton XML 1.0 sans aucun problème.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre actif
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2007
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 199
    Points : 297
    Points
    297
    Par défaut
    Je pense qu'il voulait dire qu'il ne pouvait utiliser que XSLT 1

    non ?
    "Chuck Norris a déjà compté jusqu'à l'infini. Deux fois."

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Possible mais lui seul le sait.

    Il n'y a rien de surprenant à ce que les contraintes interdisent autre chose que XML 1.0. Il est par contre plus rare que soit interdit XSLT 2.0.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre régulier Avatar de yaya_la_rafale
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 92
    Points : 70
    Points
    70
    Par défaut
    merci de vos réponses.

    Mais j'ai du mal m'exprimer, j'utilise vivissimo (IBM data explorer) et beaucoup de fonctions de XSLT 2 me sont interdites.
    il me faut donc transformer ce code en XSLT1

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Dans ce cas ça va être plus compliqué. Il va falloir appliquer la méthode Muench.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    pour avoir en sortie
    promoted:item1, item2, item4
    tool:item3,item5,item6
    En xslt 1.0, vous pouvez faire comme ça si ça vous aide.
    Code xslt : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <xsl:key name="content-group" match="document/content[@name='v_strType']" use="." />
    <xsl:template match="/vce">
        <xsl:for-each select="document/content[@name='v_strType'][count(.|key('content-group', .)[1])=1]">
            <!-- pour illustrer comment vous pouvez controller l'ordre, sinon, l'ordre est dit documentaire. -->
            <!--
            <xsl:sort select="." order="descending" data-type="text" />
            -->
            <xsl:value-of select="concat(.,': ')" />
            <xsl:for-each select="key('content-group', .)">
                <!-- pour illustrer comment vous pouvez controller l'ordre, sinon, l'ordre est dit documentaire. -->
                <!--
                <xsl:sort select="preceding-sibling::content[@name='thevalue']" order="descending" data-type="text" />
                -->
                <xsl:value-of select="preceding-sibling::content[@name='thevalue']" />
                <xsl:if test="position() != last()">
                    <xsl:text>, </xsl:text>
                </xsl:if>
            </xsl:for-each>
            <xsl:text>&#x0d;&#x0a;</xsl:text>
        </xsl:for-each>
    </xsl:template>
    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 ?
    Le code dessus contient des illustrations comment contrôller l'ordre et par défaut ce serait l'ordre dit documentaire. Mais si vous allez si loins d'en vouloir un ordre tout libre, c'est peut-être pas si commode (il faut une enumération explicite des valeurs connues en avance rarement réalisable), voire impossible ... Voilà.

  11. #11
    Membre régulier Avatar de yaya_la_rafale
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 92
    Points : 70
    Points
    70
    Par défaut
    merci tsuji de cette reponse.
    oui ton code marche. MAIS toujours mon probleme de balise non acceptee. je renonce.
    je vais prendre le probleme differemment.
    merci pour cette aide tout de meme.

  12. #12
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    "balise non acceptée." Eh ben -_-°.

    Enfin, bon courage avec ta nouvelle approche.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre régulier Avatar de yaya_la_rafale
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 92
    Points : 70
    Points
    70
    Par défaut
    je marque cette discussion à résolu, car le code en haut marche bien en v2.
    et theelvin a trouvé une bonne alternative avec un code ds ce style
    <xsl:for-each select="document[content[@name='myType']='typeA'][position() &lt; 4]">
    merci pour votre aide à tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. insérer des lignes par rapport a une valeur dans la ligne au-dessus
    Par samihichem dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 21/05/2015, 09h08
  2. Creer des user par code dans une base de donnees Interbase
    Par dachir dans le forum Bases de données
    Réponses: 2
    Dernier message: 16/07/2006, 14h55
  3. [VBA-E] Copie par valeur d'une feuille dans un nouveau classeur
    Par MatMeuh dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 17/05/2006, 22h38
  4. [CR] Grouper des minutes par cinq et non une par une.
    Par Etienne51 dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 14/09/2004, 13h45
  5. [CR]grouper des dates par semaines, mais semaines FR !
    Par neo.51 dans le forum SAP Crystal Reports
    Réponses: 11
    Dernier message: 18/05/2004, 20h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo