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 :

[XSLT] Besoin d'aide fusion d'information


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    237
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 237
    Points : 88
    Points
    88
    Par défaut [XSLT] Besoin d'aide fusion d'information
    Bonjour,

    Je ne connais pas XSL et je voudrai transformé le contenu XML 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
    <table><tgroup><tbody>
    <row>
    <entry colname="col1" rowsep="0">A</entry>
    <entry colname="col2" rowsep="0">XX</entry>
    <entry colname="col3" rowsep="0">AA</entry>
    <entry colname="col4" rowsep="0">AAA</entry>
    <entry colname="col5" rowsep="0"><PARA>AAAA</PARA></entry>
    <entry colname="col6" rowsep="0">TITRE A</entry>
    </row>
    <row>
    <entry colname="col1" rowsep="0">B</entry>
    <entry colname="col2" rowsep="0">YY</entry>
    <entry colname="col3" rowsep="0">BB</entry>
    <entry colname="col4" rowsep="0">BBB</entry>
    <entry colname="col5" rowsep="0"><PARA>BBBB</PARA></entry>
    <entry colname="col6" rowsep="0">TITRE B</entry>
    </row>
    <row>
    <entry colname="col1" rowsep="0">A</entry>
    <entry colname="col2" rowsep="0">XX</entry>
    <entry colname="col3" rowsep="0">AA</entry>
    <entry colname="col4" rowsep="0">AAA</entry>
    <entry colname="col5" rowsep="0"><PARA>AAAA</PARA></entry>
    <entry colname="col6" rowsep="0">TITRE A</entry>
    </row>
    </tbody></tgroup></table>
    Comme dans l'exemple :
    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
    <table><tgroup><tbody>
    <row>
    <entry colname="col1" rowsep="0">A</entry>
    <entry colname="col2" rowsep="0">XX ZZ</entry>
    <entry colname="col3" rowsep="0">AA</entry>
    <entry colname="col4" rowsep="0">AAA</entry>
    <entry colname="col5" rowsep="0"><PARA>AAAA</PARA></entry>
    <entry colname="col6" rowsep="0">TITRE A</entry>
    </row>
    <row>
    <entry colname="col1" rowsep="0">B</entry>
    <entry colname="col2" rowsep="0">YY</entry>
    <entry colname="col3" rowsep="0">BB</entry>
    <entry colname="col4" rowsep="0">BBB</entry>
    <entry colname="col5" rowsep="0"><PARA>BBBB</PARA></entry>
    <entry colname="col6" rowsep="0">TITRE B</entry>
    </row>
    </tbody></tgroup></table>
    Objectif : Regrouper les col2 pour les col1, col3, col4, col5 et col6 identiques

    Merci pour votre aide

  2. #2
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    237
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 237
    Points : 88
    Points
    88
    Par défaut
    Ça doit être compliqué car je n'ai aucune réponse

  3. #3
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    non , mais:
    1) ton exemple de départ (pas de zz dans la source) est faux
    2) le forum est là pour t'aider, pas pour tout faire hors tu n'as même pas fourni un début de XSLT.



    le principe de fonctionnement des regroupements est expliqué ici
    Comment regrouper les noeuds en fonction de leurs éléments qui se ressemblent ?

    Commence à coder et si tu as un problème poste ce que tu as écrit on t'aidera alors à corriger

  4. #4
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    237
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 237
    Points : 88
    Points
    88
    Par défaut
    Comme je l'indiquai, je ne connais pas du tout ce langage, juste pour info est il possible de faire ma demande en XSL ou non alors dans ce cas je vais essayer avec un autre langage

    Merci

  5. #5
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    237
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 237
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par henri93 Voir le message
    Bonjour,

    Je ne connais pas XSL et je voudrai transformé le contenu XML 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
    <table><tgroup><tbody>
    <row>
    <entry colname="col1" rowsep="0">A</entry>
    <entry colname="col2" rowsep="0">XX</entry>
    <entry colname="col3" rowsep="0">AA</entry>
    <entry colname="col4" rowsep="0">AAA</entry>
    <entry colname="col5" rowsep="0"><PARA>AAAA</PARA></entry>
    <entry colname="col6" rowsep="0">TITRE A</entry>
    </row>
    <row>
    <entry colname="col1" rowsep="0">B</entry>
    <entry colname="col2" rowsep="0">YY</entry>
    <entry colname="col3" rowsep="0">BB</entry>
    <entry colname="col4" rowsep="0">BBB</entry>
    <entry colname="col5" rowsep="0"><PARA>BBBB</PARA></entry>
    <entry colname="col6" rowsep="0">TITRE B</entry>
    </row>
    <row>
    <entry colname="col1" rowsep="0">A</entry>
    <entry colname="col2" rowsep="0">ZZ</entry>
    <entry colname="col3" rowsep="0">AA</entry>
    <entry colname="col4" rowsep="0">AAA</entry>
    <entry colname="col5" rowsep="0"><PARA>AAAA</PARA></entry>
    <entry colname="col6" rowsep="0">TITRE A</entry>
    </row>
    </tbody></tgroup></table>
    Comme dans l'exemple :
    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
    <table><tgroup><tbody>
    <row>
    <entry colname="col1" rowsep="0">A</entry>
    <entry colname="col2" rowsep="0">XX ZZ</entry>
    <entry colname="col3" rowsep="0">AA</entry>
    <entry colname="col4" rowsep="0">AAA</entry>
    <entry colname="col5" rowsep="0"><PARA>AAAA</PARA></entry>
    <entry colname="col6" rowsep="0">TITRE A</entry>
    </row>
    <row>
    <entry colname="col1" rowsep="0">B</entry>
    <entry colname="col2" rowsep="0">YY</entry>
    <entry colname="col3" rowsep="0">BB</entry>
    <entry colname="col4" rowsep="0">BBB</entry>
    <entry colname="col5" rowsep="0"><PARA>BBBB</PARA></entry>
    <entry colname="col6" rowsep="0">TITRE B</entry>
    </row>
    </tbody></tgroup></table>
    Objectif : Regrouper les col2 pour les col1, col3, col4, col5 et col6 identiques

    Merci pour votre aide
    Voilà le bout de code que j'ai essayé de mettre au point pour l'instant je fais le test sur une colonne:
    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
    	<xsl:template match="tbody">
    		<tbody>
    		<xsl:for-each select="row">
    			<xsl:variable name="col1"><xsl:value-of select="entry[@colname='col1']"/></xsl:variable>
    			<xsl:if test="not(preceding::row[entry[@colname='col1' and ./text()=$col1 ]])">
    				<xsl:variable name="contentOfCol2">
    					<xsl:for-each select="following::row[entry[@colname='col1' and ./text()=$col1]]">
    						<xsl:text> </xsl:text>
    						<xsl:value-of select="entry[colname='col2']/text()"/>
    					</xsl:for-each>
    				</xsl:variable>
    				<row>
    					<xsl:copy-of select="./entry[colname='col1']"/>
    					<entry colname="col2"><xsl:value-of select="$contentOfCol2"/></entry>
    					<xsl:copy-of select="./entry[colname='col3']"/>
    					<xsl:copy-of select="./entry[colname='col4']"/>
    					<xsl:copy-of select="./entry[colname='col5']"/>
    					<xsl:copy-of select="./entry[colname='col6']"/>
    				</row>
    			</xsl:if>
    		</xsl:for-each>
    		</tbody>
    	</xsl:template>
    et voilà le résultat obtenue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                      <tbody>
                         <row>
                            <entry colname="col2">  </entry>
                         </row>
                         <row>
                            <entry colname="col2"/>
                         </row>
                      </tbody>
    Merci d'avance, je vais voir si je peux tracer le résultat

  6. #6
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    237
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 237
    Points : 88
    Points
    88
    Par défaut
    J'ai fait plusieurs modifications dans le xsl, j'obtiens maintenant un résultat presque correcte, il me manque la première occurence xml ?
    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
    		<tbody>
    		<xsl:for-each select="row">
    			<xsl:variable name="col1"><xsl:value-of select="entry[@colname='col1']"/></xsl:variable>
    			<xsl:if test="not(preceding::row[entry[@colname='col1' and ./text()=$col1 ]])">
    				<xsl:variable name="contentOfCol2">
    					<xsl:for-each select="following::row[entry[@colname='col1' and ./text()=$col1]]">
    						<xsl:text>~</xsl:text>
    						<xsl:value-of select="entry[@colname='col2']/text()"/>
    					</xsl:for-each>
    				</xsl:variable>
    				<row>
    					<xsl:copy-of select="./entry[@colname='col1']"/>
    					<entry colname="col2"><xsl:value-of select="$contentOfCol2"/></entry>
    					<xsl:copy-of select="./entry[@colname='col3']"/>
    					<xsl:copy-of select="./entry[@colname='col4']"/>
    					<xsl:copy-of select="./entry[@colname='col5']"/>
    					<xsl:copy-of select="./entry[@colname='col6']"/>
    				</row>
    			</xsl:if>
    		</xsl:for-each>
    		</tbody>
    En entrée j'ai :
    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
    <table><tgroup><tbody>
    <row>
    <entry colname="col1" rowsep="0">A</entry>
    <entry colname="col2" rowsep="0">XX</entry>
    <entry colname="col3" rowsep="0">AA</entry>
    <entry colname="col4" rowsep="0">AAA</entry>
    <entry colname="col5" rowsep="0"><PARA>AAAA</PARA></entry>
    <entry colname="col6" rowsep="0">TITRE A</entry>
    </row>
    <row>
    <entry colname="col1" rowsep="0">B</entry>
    <entry colname="col2" rowsep="0">YY</entry>
    <entry colname="col3" rowsep="0">BB</entry>
    <entry colname="col4" rowsep="0">BBB</entry>
    <entry colname="col5" rowsep="0"><PARA>BBBB</PARA></entry>
    <entry colname="col6" rowsep="0">TITRE B</entry>
    </row>
    <row>
    <entry colname="col1" rowsep="0">A</entry>
    <entry colname="col2" rowsep="0">ZZ</entry>
    <entry colname="col3" rowsep="0">AA</entry>
    <entry colname="col4" rowsep="0">AAA</entry>
    <entry colname="col5" rowsep="0"><PARA>AAAA</PARA></entry>
    <entry colname="col6" rowsep="0">TITRE A</entry>
    </row>
    </tbody></tgroup></table>
    et en résultat j'obtiens :
    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
    <table><tgroup><tbody>
    <row>
    <entry colname="col1" rowsep="0">A</entry>
    <entry colname="col2" rowsep="0">~ZZ</entry>
    <entry colname="col3" rowsep="0">AA</entry>
    <entry colname="col4" rowsep="0">AAA</entry>
    <entry colname="col5" rowsep="0"><PARA>AAAA</PARA></entry>
    <entry colname="col6" rowsep="0">TITRE A</entry>
    </row>
    <row>
    <entry colname="col1" rowsep="0">B</entry>
    <entry colname="col2" rowsep="0"/>
    <entry colname="col3" rowsep="0">BB</entry>
    <entry colname="col4" rowsep="0">BBB</entry>
    <entry colname="col5" rowsep="0"><PARA>BBBB</PARA></entry>
    <entry colname="col6" rowsep="0">TITRE B</entry>
    </row>
    </tbody></tgroup></table>
    Pour la première occurrence je devrais avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <entry colname="col2" rowsep="0">XX~ZZ</entry>
    Pour la seconde occurrence je devrais avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <entry colname="col2" rowsep="0">YY</entry>
    Si quelqu'un a une idée

    Merci

  7. #7
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    je n'ai pas pris ton approche basé sur xpath
    1) c'est tres,tres couteux d'un point de vue processeur
    2) pour la suite cela complique le regroupement

    J'ai donc repris la méthode que j'avais mis en lien (attention, je n'ai traité que le point regroupement, pour le reste je n'ai rien vérifié)
    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
    	<xsl:key match="row" name="ligne" use="concat(entry[@colname='col1'],entry[@colname='col3'],entry[@colname='col4'],entry[@colname='col5'],entry[@colname='col6'])"/>
    	<xsl:template match="/">
    		<tbody>
    			<xsl:apply-templates select="//row[generate-id(.)=generate-id(key('ligne',concat(entry[@colname='col1'],entry[@colname='col3'],entry[@colname='col4'],entry[@colname='col5'],entry[@colname='col6']))[1])]" mode="regroupement">
    			</xsl:apply-templates>
    		</tbody>
    	</xsl:template>
    	<xsl:template match="row" mode="regroupement">
    		<row>
    			<xsl:copy-of select="./entry[@colname='col1']"/>
    			<entry colname="col2">
    				<xsl:apply-templates select="key('ligne',concat(entry[@colname='col1'],entry[@colname='col3'],entry[@colname='col4'],entry[@colname='col5'],entry[@colname='col6']))" mode="concatenation"/>
    			</entry>
    			<xsl:copy-of select="./entry[@colname='col3']"/>
    			<xsl:copy-of select="./entry[@colname='col4']"/>
    			<xsl:copy-of select="./entry[@colname='col5']"/>
    			<xsl:copy-of select="./entry[@colname='col6']"/>
    		</row>
    	</xsl:template>
    	<xsl:template match="row" mode="concatenation">
    		<xsl:value-of select="concat(' ',entry[@colname='col2'])"/>
    	</xsl:template>
    Il y a largemment matière à optimisation

  8. #8
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    237
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 237
    Points : 88
    Points
    88
    Par défaut
    c'est super, je vais essayer d'analyser ton code pour être moins bête la prochaine fois.
    Il me reste à regarder comment mettre un paramètre, j'ai 2 types de tableau et avec ton code je récupère dans le body les lignes identifiants les thead

    Concernant l'optimisation comment un novice peut savoir ce qui est optimisable ? Il existe de la documentation sur ce sujet ?

    un grand merci

  9. #9
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Citation Envoyé par henri93 Voir le message

    Concernant l'optimisation comment un novice peut savoir ce qui est optimisable ? Il existe de la documentation sur ce sujet ?
    un exemple possible

    si l'ordre d'ecriture t'indifère
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	<row>
    			<xsl:copy-of select="./entry[@colname='col1']"/>
    			<entry colname="col2">
    				<xsl:apply-templates select="key('ligne',concat(entry[@colname='col1'],entry[@colname='col3'],entry[@colname='col4'],entry[@colname='col5'],entry[@colname='col6']))" mode="concatenation"/>
    			</entry>
    			<xsl:copy-of select="./entry[@colname='col3']"/>
    			<xsl:copy-of select="./entry[@colname='col4']"/>
    			<xsl:copy-of select="./entry[@colname='col5']"/>
    			<xsl:copy-of select="./entry[@colname='col6']"/>
    		</row>
    tu pourrais écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	<row>
     
    			<entry colname="col2">
    				<xsl:apply-templates select="key('ligne',concat(entry[@colname='col1'],entry[@colname='col3'],entry[@colname='col4'],entry[@colname='col5'],entry[@colname='col6']))" mode="concatenation"/>
    			</entry>
    			<xsl:copy-of select="./entry[@colname!='col2']"/>
     
    		</row>
    Pour le reste j'ai appris à l'usage, n'ayant quasiment pas utilisé de doc a part la norme du W3C, je n'ai pas de lien à donner

  10. #10
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    237
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 237
    Points : 88
    Points
    88
    Par défaut
    En effet c'est impressionnant le code est bien optimisé, il me reste à comprendre l'optimisation.

    Si je peux encore abuser de ton temps, J'ai une dernière question

    En début de la feuille de style, j'ai le code suivant qui me permet de récupérer des données. Le problème est que je perds la DTD qui est dans le fichier XML, j'ai du oublié une information dans le match

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	<xsl:template match="processing-instruction() | node() | @*">
    		<xsl:copy>
    			<xsl:apply-templates select="processing-instruction() | @* | node()"/>
    		</xsl:copy>
    	</xsl:template>
    Merci

  11. #11
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Citation Envoyé par henri93 Voir le message
    En effet c'est impressionnant le code est bien optimisé, il me reste à comprendre l'optimisation.
    Si c'est l'exemple donné c'est assez simple.
    Je pense que tu es parti du principe que xsl:copy-of copie une balise et ses enfants, hors c'est inexact, il copie toutes les balises fourni par le xpath dans le select, il suffit donc ce cas de lui dire de cpie toutes les entru sauf la 2

    Citation Envoyé par henri93 Voir le message
    Si je peux encore abuser de ton temps, J'ai une dernière question

    En début de la feuille de style, j'ai le code suivant qui me permet de récupérer des données. Le problème est que je perds la DTD qui est dans le fichier XML, j'ai du oublié une information dans le match
    Désolé, je ne suis pas des DTD donc je connais mal le problème.
    Ce que je subodorre:
    Les DTD sont plus anciennes que le XML et ne sont donc pas à sa norme.leur présence est donc une forme de "dérogation".
    De fait elles ne sont traités ni pas xpath ni xslt

Discussions similaires

  1. Besoin d'aide en XSLT
    Par Debutantxslt dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 05/05/2014, 11h06
  2. [XSLT] besoin d'aide XML -> listes HTML imbriquées
    Par lasdou15 dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 17/04/2008, 13h47
  3. [TP]besoin d'aide pour commandes inconnues
    Par Upal dans le forum Turbo Pascal
    Réponses: 15
    Dernier message: 03/10/2002, 10h48
  4. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05

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