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 :

Compacter plusieurs noeuds [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 4
    Points
    4
    Par défaut Compacter plusieurs noeuds
    Bonjour,

    J'ai un fichier xml avec cette syntaxe:
    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
    <Occurrence id="id1" occurrenceRefs="id2 id3 id4 id5">
    	<UserValue value="" title="Quantity"></UserValue>
    	<UserValue value="" title="SequenceNumber"></UserValue>
    	<UserValue value="ID-01" title="Item_ID"></UserValue>
    </Occurrence>
    <Occurrence id="id2" parentRef="#id1">
    	<UserValue value="1" title="Quantity"></UserValue>
    	<UserValue value="10" title="SequenceNumber"></UserValue>
    	<UserValue value="ID-02" title="Item_ID"></UserValue>
    </Occurrence>
    <Occurrence id="id3" parentRef="#id1">
    	<UserValue value="1" title="Quantity"></UserValue>
    	<UserValue value="10" title="SequenceNumber"></UserValue>
    	<UserValue value="ID-02" title="Item_ID"></UserValue>
    </Occurrence>
    <Occurrence id="id4" parentRef="#id1">
    	<UserValue value="1" title="Quantity"></UserValue>
    	<UserValue value="20" title="SequenceNumber"></UserValue>
    	<UserValue value="ID-03" title="Item_ID"></UserValue>
    </Occurrence>
    <Occurrence id="id5" parentRef="#id1">
    	<UserValue value="1" title="Quantity"></UserValue>
    	<UserValue value="20" title="SequenceNumber"></UserValue>
    	<UserValue value="ID-03" title="Item_ID"></UserValue>
    </Occurrence>
    Pour l'instant je génére ce tableau:
    Sequence Number Quantity Item ID
    X ID-01
    10 1 ID-02
    10 1 ID-02
    20 1 ID-03
    20 1 ID-03

    Mon but est de générer un fichier html comprenant le tableau ci-dessous:
    Sequence Number Quantity Item ID
    X ID-01
    10 2 ID-02
    20 2 ID-03


    Pour générer ce tableau, j'utilise une fonction récursive (en utilisant string-before et string-after sur "occurrenceRefs"), et pour l'instant je ne trouve pas comment compacter mes différents noeuds qui :
    - sont lié au même niveau de l'arbre (le xml représente un arbre/nomenclature);
    - ont un "SequenceNumber" identique;
    - ont un "Item_ID" identique.

    Pour l'instant mon idée est de trouver un moyen de conserver l'id du noeud traité précédemment, mais je bute un peu sur comment remonter sur la ligne supérieure dans le html pour additionner les quantités.


    Merci d'avance pour votre aide.

  2. #2
    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
    Oui, c'est un problème typique dit groupement ... On peut le faire d'un façon plus avancée et efficace pour un tableau important en utilisant l'élément xsl:key, et ce n'est pas difficile à trouver des examples en googlant avec ce mot clé. Je peux d'ailleurs vous proposer une façon plus élémentaire sans xsl:key. C'est élémentaire mais plus instructif et je trouve aussi pour cela plus intéressant.
    Code xml : 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:template match="Occurrence">
        <xsl:variable name="filter" select="UserValue[@title='Item_ID']/@value" />
        <xsl:choose>
            <xsl:when test="not(preceding-sibling::Occurrence[UserValue[@title='Item_ID']/@value=$filter])">
                <tr>
                    <td><xsl:value-of select="concat('&#xa0;', UserValue[@title='SequenceNumber']/@value)" /></td>
                    <td>
                        <xsl:value-of select="sum(
                            self::Occurrence/UserValue[@title='Quantity']/@value
                            |
                            following-sibling::Occurrence[UserValue[@title='Item_ID']/@value=$filter]/UserValue[@title='Quantity']/@value
                            )"
                        />
                    </td>
                    <td><xsl:value-of select="concat('&#xa0;', UserValue[@title='Item_ID']/@value)" /></td>
                </tr>
            </xsl:when>
            <xsl:otherwise>
                <!-- ne rien faire -->
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    En gros, c'est ça.

  3. #3
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Merci tsuji pour votre aide, je suis en train de tester la méthode élémentaire.

    Par contre j'ai un doute sur le fait de faire le test sur les noeuds précédents avec 2 conditions: même ID et même SequenceNumber.

    Pensez-vous que cela soit possible? Car je ne vois pas comment l'écrire (et Google n'est pas mon ami sur ce coup).

    J'ai commencé par écrire cela, mais je suis convaincu que cela ne fonctionne pas (les 2 conditions se vérifient indépendamment je pense)

    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
    <xsl:template match="Occurrence">
        <xsl:variable name="filterId" select="/plm:PLMXML/plm:ProductView/plm:Occurrence/plm:UserValue[@title='Item_ID']/@value"/>
        <xsl:variable name="filterSeqno" select="/plm:PLMXML/plm:ProductView/plm:Occurrence/plm:UserValue[@title='SequenceNumber']/@value"/>
        <xsl:variable name="occ" select="/plm:PLMXML/plm:ProductView/plm:Occurrence"/>
     
        <xsl:choose>
            <xsl:when test="not(preceding-sibling::$occ[UserValue[@title='Item_ID']/@value=$filterId]) and not(preceding-sibling::$occ[UserValue[@title='SequenceNumber']/@value=$filterFindno])">
                <tr>
                    <td><xsl:value-of select="concat('&#xa0;', UserValue[@title='SequenceNumber']/@value)" /></td>
                    <td>
                        <xsl:value-of select="sum(
                            self::Occurrence/UserValue[@title='Quantity']/@value
                            |
                            following-sibling::Occurrence[UserValue[@title='Item_ID']/@value=$filter]/UserValue[@title='Quantity']/@value
                            )"
                        />
                    </td>
                    <td><xsl:value-of select="concat('&#xa0;', UserValue[@title='Item_ID']/@value)" /></td>
                </tr>
            </xsl:when>
            <xsl:otherwise>
                <!-- ne rien faire -->
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    En tout cas, encore merci pour ta réponse, elle m'a vraiment fait avancée

  4. #4
    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
    C'est vrai j'ai pensé que la valeur de SequenceNumber soit forcément le même pour une valeur d'Item_ID donnée. Si ça peux varier indépendemment, il faut tenir compte de ce fait. Les variables comme vous entendez seraient quelque chose comme ça.
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:variable name="filterId" select="UserValue[@title='Item_ID']/@value" />
    <xsl:variable name="filterSeqno" select="UserValue[@title='SequenceNumber']/@value" />
    Les variables $filterId et $filterSeqno sont celles déterminées par l'Occurrence en contexte, pas n'importe quel Occurrence déterminé par un xpath absolu à partir de la racine /plmLMXML ou je ne sais quoi. C'est important.

    Et puis le conditionnel serait comme ceci.
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:when test="not(preceding-sibling::Occurrence[
        UserValue[@title='Item_ID']/@value=$filterId
        and
        UserValue[@title='SequenceNumber']/@value=$filterSeqno
    ])">

    Tous xpaths sont relatifs au contexte Occurrence, donc, les xpaths absolus ne me semblent pas pertinents. Si l'Occurrence se voit partout, au plus, on met preceding:: et following:: au lieu de preceding-siblings:: et following-siblings::. Mais je n'ai pas encore regardé votre script de très près.

    ps: Pour faire une somme numérique sur la valeur de @title='Quantity', il faut que @value soit numérique. Un texte vide n'est parfois par assez bon pour certaine implémentation. L'admissibilité par casting un texte vide à un zero est implémentation-dépendant. Je n'avait pas mentionné ça avant ! Donc, pour faire tester, il vaut mieux de mettre en garde de ça et remplacer les texte vides par "0" pour une meilleure assurance.

  5. #5
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Merci !

    Pour le xpath absolu, il ne l'est pas vraiment, j'ai oublié la référence de l'occurrence (id), c'est grâce à cet id que je récupère via "occurrenceRefs" chaque occurrence que je parcours 1 à 1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:variable name="filterId" select="/plm:PLMXML/plm:ProductView/plm:Occurrence[@id=$occid]/plm:UserValue[@title='Item_ID']/@value"/>
    <xsl:variable name="filterSeqno" select="/plm:PLMXML/plm:ProductView/plm:Occurrence[@id=$occid]/plm:UserValue[@title='SequenceNumber']/@value"/>

    Voici mon code xsl (en court car il fait 1300 lignes environ) :

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <xsl:variable name="primaryOccRef" select="/plm:PLMXML/plm:ProductView/@primaryOccurrenceRef"/>
     
    <xsl:call-template name="createCL">
    	<xsl:with-param name="occStr" select="/plm:PLMXML/plm:ProductView/plm:Occurrence[@id=$primaryOccRef]/@occurrenceRefs"/>
    </xsl:call-template>
     
    <xsl:template name="createCL">
    	<xsl:param name="occStr"/>
     
    	<xsl:if test="$occStr!=''">
    		<xsl:choose>
    			<xsl:when test="contains($occStr,' ')">
    				<xsl:variable name="occid" select="substring-before($occStr,' ')"/>
     
    				<xsl:call-template name="createCL">
    					<xsl:with-param name="occStr" select="$occid"/>
    				</xsl:call-template>
     
    				<xsl:call-template name="createCL">
    					<xsl:with-param name="occStr" select="substring-after($occStr,' ')"/>
    				</xsl:call-template>
    			</xsl:when>
     
    			<xsl:otherwise>
    				<xsl:call-template name="creCLext">
    					<xsl:with-param name="occid" select="$occStr"/>
    				</xsl:call-template>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:if>
    </xsl:template>
     
    <xsl:template name="creCLext">
        <xsl:param name="occid"/>
     
        <xsl:variable name="quantity" select="/plm:PLMXML/plm:ProductView/plm:Occurrence[@id=$occid]/plm:UserValue[@title='Quantity']/@value" />
        <xsl:variable name="findno" select="/plm:PLMXML/plm:ProductView/plm:Occurrence[@id=$occid]/plm:UserValue[@title='SequenceNumber']/@value" />
        <xsl:variable name="itemref" select="/plm:PLMXML/plm:ProductView/plm:Occurrence[@id=$occid]/plm:UserValue[@title='instanceRef']/@value" />
        <xsl:variable name="itemid" select="/plm:PLMXML/plm:ItemRevision[@id=$itemref]/plm:UserValue[@title='Item_ID']/@value" />
     
        <tr>
    	<td>
    		<xsl:value-of select="substring($findno,1,4)"/>
    	</td>
    	<td>
    		<xsl:value-of select="$quantity"/>
    	</td>
    	<td>
    		<xsl:value-of select="$itemid"/>
    	</td>
        </tr>
    </template>
    Et un exemple du xml d'entrée (aussi en plus court, ils font au minimum 3000 lignes):
    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
    33
    <PLMXML>
    <ProductView id="id4" ruleRefs="#id2" rootRefs="id1" primaryOccurrenceRef="id1">
    	<Occurrence id="id1" instanceRef="#id10" occurrenceRefs="id2 id3 id4 id5">
    		<UserValue value="" title="Quantity"></UserValue>
    		<UserValue value="" title="SequenceNumber"></UserValue>
    	</Occurrence>
    	<Occurrence id="id2" instanceRef="#id11" parentRef="#id1">
    		<UserValue value="1" title="Quantity"></UserValue>
    		<UserValue value="10" title="SequenceNumber"></UserValue>
    	</Occurrence>
    	<Occurrence id="id3" instanceRef="#id11" parentRef="#id1">
    		<UserValue value="1" title="Quantity"></UserValue>
    		<UserValue value="10" title="SequenceNumber"></UserValue>
    	</Occurrence>
    	<Occurrence id="id4" instanceRef="#id12" parentRef="#id1">
    		<UserValue value="1" title="Quantity"></UserValue>
    		<UserValue value="20" title="SequenceNumber"></UserValue>
    	</Occurrence>
    	<Occurrence id="id5" instanceRef="#id12" parentRef="#id1">
    		<UserValue value="1" title="Quantity"></UserValue>
    		<UserValue value="20" title="SequenceNumber"></UserValue>
    	</Occurrence>
    </ProductView>
    <ItemRevision id="id10">
    	<UserValue value="ID-01" title="Item_ID"/>
    </ItemRevision>
    <ItemRevision id="id11">
    	<UserValue value="ID-02" title="Item_ID"/>
    </ItemRevision>
    <ItemRevision id="id12">
    	<UserValue value="ID-03" title="Item_ID"/>
    </ItemRevision>
    </PLMXML>
    Malheureusement cela ne fonctionne pas et j'ai bien peur de devoir passer par un xsl:key, non?

  6. #6
    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
    Si on change la sturcture tous les deux réponses, on n'en finirait pas. En tout cas, si vous entendez qu'il y a beaucoup de PLMXML et qu'on est dans le contexte de PLMXML, les xpath absolus ne seraient toujours pas corrects. Enfin, je ne sais même pas quel contexte on se place, donc, je n'ai en principe rien à dire pour ne pas jéter plus de confusion. Avec les nouvelles donnée, je ne sais même pas si c'est prêt à faire un groupement dans l'étape présent de xslt.

    En tout cas, je vois ceci est faux, tout simplement.
    <xsl:variable name="itemref" select="/plm:PLMXML/plm:ProductView/plm:Occurrence[@id=$occid]/plm:UserValue[@title='instanceRef']/@value" />
    (où se situe @title='instanceRef' !?) et donc,
    <xsl:variable name="itemid" select="/plm:PLMXML/plm:ItemRevision[@id=$itemref]/plm:UserValue[@title='Item_ID']/@value" />
    n'est non plusaussi.

    Si vous voulez faire un scale-down modèle de xml et xslt, il faut toujours préserver tous les aspects essentiels : le xml les namespaces, le xslt le contexte (le template, le match). Si non, je répète, on n'en finit pas jamais.

  7. #7
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Désolé j'avais essayé de simplifier au maximum le problème pour ne pas faire perdre trop de temps aux personnes voulant m'aider, a priori cela n'a pas eu l'effet escompté, je m'en excuse.

    Pour la variable "itemref", oui mauvaise copier-coller,c'est bien cela qui est écrit dans mon code:
    <xsl:variable name="itemref" select="substring-after(/plm:PLMXML/plm:ProductView/plm:Occurrence[@id=$occid]/@instanceRef, '#')" />
    Mon contexte est bien les occurrences, c'est grâce à elles que je crée mon tableau, cependant pour chaque occurrence je dois aller récupérer plusieurs informations dans d'autres noeuds, pas des noeuds occurrences mais des noeuds ItemRevision.

    En tout cas encore merci pour vos réponses

  8. #8
    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
    Si je me permets de critiquer la nouvelle structure de votre xml, je dirais qu'il est bien trop sur-déterminant avec des références circulaires, multiples redonantes sur les id qui poserait une énorme difficulté latante de le maintenir. Mais, on fait ce qu'on a et je comprends.

    Je peux vous fournir un complet démo pour que vous travaileriez plus facilement après en vous-même.

    [1] le xml des données
    Code xml : 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
    33
    34
    35
    36
    37
    38
    39
    <root xmlns="urn:plmxml">
        <PLMXML>
            <ProductView id="id4" ruleRefs="#id2" rootRefs="id1" primaryOccurrenceRef="id1">
                <Occurrence id="id1" instanceRef="#id10" occurrenceRefs="id2 id3 id4 id5">
                    <UserValue value="" title="Quantity"></UserValue>
                    <UserValue value="" title="SequenceNumber"></UserValue>
                </Occurrence>
                <Occurrence id="id2" instanceRef="#id11" parentRef="#id1">
                    <UserValue value="1" title="Quantity"></UserValue>
                    <UserValue value="10" title="SequenceNumber"></UserValue>
                </Occurrence>
                <Occurrence id="id3" instanceRef="#id11" parentRef="#id1">
                    <UserValue value="1" title="Quantity"></UserValue>
                    <UserValue value="10" title="SequenceNumber"></UserValue>
                </Occurrence>
                <Occurrence id="id4" instanceRef="#id12" parentRef="#id1">
                    <UserValue value="1" title="Quantity"></UserValue>
                    <UserValue value="20" title="SequenceNumber"></UserValue>
                </Occurrence>
                <Occurrence id="id5" instanceRef="#id12" parentRef="#id1">
                    <UserValue value="1" title="Quantity"></UserValue>
                    <UserValue value="20" title="SequenceNumber"></UserValue>
                </Occurrence>
            </ProductView>
            <ItemRevision id="id10">
                <UserValue value="ID-01" title="Item_ID"/>
            </ItemRevision>
            <ItemRevision id="id11">
                <UserValue value="ID-02" title="Item_ID"/>
            </ItemRevision>
            <ItemRevision id="id12">
                <UserValue value="ID-03" title="Item_ID"/>
            </ItemRevision>
        </PLMXML>
        <!-- 
            beaucoup plus d'instances de PLMXML anticipées caractérisées par son plm:ProductView/@primaryOccurrenceRef 
            ainsi recherchée via $occid.
        -->
    </root>

    [2] le xslt
    Code xml : 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:plm="urn:plmxml"
        exclude-result-prefixes="plm"
    >
    <xsl:output method="html" omit-xml-declaration="yes" encoding="utf-8" />
     
    <xsl:param name="occid" select="'id1'" />
     
    <xsl:template match="/">
        <html>
            <head />
            <body>
                <xsl:apply-templates select="*" />
            </body>
        </html>
    </xsl:template>
     
    <xsl:template match="plm:root">
        <xsl:apply-templates select="plm:PLMXML[plm:ProductView/@primaryOccurrenceRef=$occid]" mode="special" />
    </xsl:template>
     
    <xsl:template match="plm:PLMXML" mode="special">
        <table border="1">
            <tr>
                <th>sequence number</th>
                <th>quantity</th>
                <th>item id</th>
            </tr>
            <xsl:apply-templates select="plm:ProductView/plm:Occurrence[@id=parent::*/@primaryOccurrenceRef][@occurrenceRefs]" mode="special" />
        </table>
    </xsl:template>
     
    <xsl:template match="plm:Occurrence[@occurrenceRefs]" mode="special">
        <xsl:variable name="idref" select="substring-after(@instanceRef, '#')" />
        <xsl:variable name="filterIdRefs" select="@occurrenceRefs" />
        <tr>
            <td>&#xa0;</td>
            <td>&#xa0;</td>
            <td><xsl:value-of select="concat('&#xa0;', ancestor::plm:PLMXML/plm:ItemRevision[@id=$idref]/plm:UserValue[@title='Item_ID']/@value)" /></td>
        </tr>
        <xsl:apply-templates select="parent::*/plm:Occurrence[not(@occurrenceRefs)][contains($filterIdRefs, @id)]" mode="special" />
    </xsl:template>
     
    <xsl:template match="plm:Occurrence[not(@occurrenceRefs)]" mode="special">
        <xsl:variable name="filterId" select="@instanceRef" />
        <xsl:variable name="filterSeqno" select="plm:UserValue[@title='SequenceNumber']/@value" />
        <xsl:choose>
            <xsl:when test="not(preceding-sibling::plm:Occurrence[
                @instanceRef=$filterId
                and
                plm:UserValue[@title='SequenceNumber']/@value=$filterSeqno
            ])">
                <tr>
                    <td><xsl:value-of select="concat('&#xa0;', plm:UserValue[@title='SequenceNumber']/@value)" /></td>
                    <xsl:variable name="sum" select="sum(
                        self::plm:Occurrence/plm:UserValue[@title='Quantity']/@value
                        |
                        following-sibling::plm:Occurrence[
                            @instanceRef=$filterId
                            and
                            plm:UserValue[@title='SequenceNumber']/@value=$filterSeqno
                        ]/plm:UserValue[@title='Quantity']/@value
                    )" />
                    <td><xsl:value-of select="$sum" /></td>
                    <td><xsl:value-of select="concat('&#xa0;', ancestor::plm:PLMXML/plm:ItemRevision[@id=substring-after($filterId,'#')]/plm:UserValue[@title='Item_ID']/@value)" /></td>
                </tr>
            </xsl:when>
            <xsl:otherwise>
                <!-- ne rien faire -->
            </xsl:otherwise>
        </xsl:choose>
     
    </xsl:template>
     
    </xsl:stylesheet>
    J'ai pris soins de rester très général pour qu'il résiste des changements sur le xml qui respectent le principe de sa construction pour que le xslt reste fonctionne correctement. Comme c'est une transformation très spécialisée, j'emplois l'attribut mode pour protéger les templates pour qu'ils ne travaillent que pour une fonctionalité bien déterminée. Voilà !

  9. #9
    Candidat au Club
    Homme Profil pro
    Responsable de projet fonctionnel
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable de projet fonctionnel

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Après plusieurs ajustements par rapport à mon xml source, ça fonctionne nickel!

    Merci !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Sans votre aide, je n'y serai jamais arrivé!

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

Discussions similaires

  1. [XSLT] for-each imbriqué et plusieurs noeuds
    Par Trunks dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 31/10/2008, 15h08
  2. [XPATH] Débutant: Sélectionner un ou plusieurs noeuds
    Par Invité dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 07/12/2007, 10h30
  3. [DOM] suppression de plusieurs noeuds
    Par yannux dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 09/08/2007, 11h02
  4. [XML DOM]Supprimer plusieurs noeud
    Par Shandler dans le forum APIs
    Réponses: 9
    Dernier message: 06/06/2007, 19h30
  5. [XSLT] Plusieurs noeuds fils en 1 tour de boucle
    Par Korko Fain dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 29/05/2007, 14h30

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