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] Compteur


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Points : 13
    Points
    13
    Par défaut [XSLT] Compteur
    Bonjour,
    à partir d'un fichier XML, je génère un fichier texte.
    Dans mon fichier XML, j'ai différentes lignes que je présente dans le fichier texte sous forme d'entête et de lignes. Pour cela, je regroupe certaines lignes du fichier XML (en fonction de différentes valeurs) pour les mettre dans le même entête. Dans le fichier XML, toutes les lignes ont un même numéro. Je voudrais mettre ce numéro au niveau des entêtes dans le fichier texte mais en y ajoutant (par concaténation) un compteur pour avoir un numéro unique par entête.
    Par exemple, j'ai 5 lignes dans mon fichier XML avec le numéro 443455.
    Dans mon fichier texte, je me retrouve avec 1 entête et 2 lignes (lignes 1 et 2 du fichier XML) et une seconde entête avec les 3 autres lignes. Je voudrais avoir sur mon entête 1 le numéro 443455-A et sur mon entête 2 le numéro 443455-B. (si pas possible de mettre des lettres, remplacer par chiffres 443455-1 et 443455-2).
    Débutant dans le XSLT, je ne vois pas comment gérer ce compteur.
    Merci pour votre aide.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 155
    Points : 231
    Points
    231
    Par défaut
    Bonjour,

    xsl:number et ses différents attributs de formatage devrait convenir.

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Bonjour et merci pour la réponse,

    j'avais déjà essayé avec <xsl:number format="A"/> mais si je reprends mon exemple avec 5 lignes, au lieu d'avoir 443455-A et 443455-B j'ai 443455-A et 443455-C. J'ai l'impression que cela a compté les numéros de lignes et je n'ai pas réussi à faire le comptage seulement sur ma rupture (faite avec un if).

  4. #4
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 22
    Points : 15
    Points
    15
    Par défaut
    C'est toujours plus précis d'exposer ce qu'on veut à l'aide d'un example du xml en entrée et un example de la sortie souhaitée... peut-être avec position() tout simplement ?

  5. #5
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Voici mon 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
    19
    20
    21
    22
    23
    24
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <Commande>
    <CommandeDLR>
    <Entete>
    <NumeroCommande>443455</NumeroCommande>
    </Entete>	
    <Lignes>	        
    <ReferenceCommandeClient>1234</ReferenceCommandeClient>
    </Lignes>
    <Lignes>	        
    <ReferenceCommandeClient>1234</ReferenceCommandeClient>
    </Lignes>
    <Lignes>	        
    <ReferenceCommandeClient>1234</ReferenceCommandeClient>
    </Lignes>
    <Lignes>	        
    <ReferenceCommandeClient>4567</ReferenceCommandeClient>
    </Lignes>
    <Lignes>	        
    <ReferenceCommandeClient>4567</ReferenceCommandeClient>
    </Lignes>
    </CommandeDLR>
    </Commande>
    </xml>
    je souhaiterais avoir un fichier texte en sortie comme cela :
    443455A
    1234
    1234
    1234
    443455B
    4567
    4567


    J'ai fait ceci :
    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output encoding="iSO-8859-1" method="text"/>
    <xsl:template match="Commande">
    <xsl:apply-templates select="CommandeDLR"/>
    </xsl:template>
    <xsl:template match="CommandeDLR">
    <xsl:apply-templates select="Lignes"/>
    </xsl:template> 
    <xsl:template match="Lignes">
    <xsl:if test="not(ReferenceCommandeClient = preceding::ReferenceCommandeClient)">
    <xsl:variable name="num"><xsl:number format="A"/></xsl:variable>
    <xsl:value-of select="concat(../EnTete/NumeroCommande,$num)"/>
    </xsl:if>
    </xsl:stylesheet>
    mais je me retrouve avec 443455A et 443455C ou lieu de 443455B.

    je ne sais pas si mon exemple est très clair.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 155
    Points : 231
    Points
    231
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <xsl:template match="Lignes">
    	<xsl:if test="not(ReferenceCommandeClient = preceding::ReferenceCommandeClient)">
    		<xsl:variable name="num">
    			<xsl:number  count="Lignes[not(ReferenceCommandeClient = preceding::ReferenceCommandeClient)]" format="A"/>
    		</xsl:variable>
    		<xsl:value-of select="concat(../Entete/NumeroCommande, $num)"/><br/>
    	</xsl:if>
    	<xsl:value-of select="ReferenceCommandeClient"/><br/>
    </xsl:template>
    mais ça risque d'être assez simpliste si tu comptes faire d'autres regroupements.

  7. #7
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Merci pour la réponse.
    Après un premier test rapide, cela semble fonctionner.

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

Discussions similaires

  1. [XSLT] Compteur noeuds en sortie
    Par brunk dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 29/03/2007, 17h28
  2. [XSLT] Compteur dans un "preceding-sibling::"
    Par loloajax dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 20/11/2006, 14h12
  3. [XSLT] compteur sans doublon
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/08/2006, 12h37
  4. [xslt] compteur
    Par nemya dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 15/12/2005, 08h29
  5. [XSLT][Compteur]qui ne s'incremente pas
    Par fraoustin dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/01/2005, 18h11

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