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] création d'attributs multiples


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 16
    Points : 5
    Points
    5
    Par défaut [XSLT] création d'attributs multiples
    Bonjour à tous

    Voici mon problème :

    J'utilise une xsl qui créé un attribut "folio" à l’élément "niv1"
    et lui donne la valeur de l'attribut "folio" du dernier élément "rp"

    En plus de l'attribut "folio" dans "niv1" je voudrais aussi ajouter un deuxième attribut "id=niv1x", le x étant le rang d’apparition des éléments "niv1" dans le xml.

    Avec cette xsl, si l’attribut "id=niv1x" est déjà présent dans "niv1" au moment de passer la xsl il est supprimé.

    En résumé, j' ai ça :
    <niv1><int>

    Et je voudrais avoir ça :
    <niv1 id="niv1xx" folio="x"><int>

    (id="niv1xx" doit être numéroté 01,02… 10,11…)


    Voici la xsl :

    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
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:template match="node() | @*">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
     
        <!-- donner le @folio du rp précédent -->
        <xsl:template match="niv1">
            <xsl:copy>
                <xsl:attribute name="folio">
                    <xsl:value-of select="preceding::rp[1]/@folio"/>
                </xsl:attribute>
                <xsl:apply-templates/>
            </xsl:copy>
        </xsl:template>
     
        <!-- tout le reste : copier tel que et appeler les templates des enfants -->
        <xsl:template match="*|@*">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    </xsl:stylesheet>
    Merci d'avance pour vos réponses

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Je vois que tu sais déjà ajouter l'attribut "folio".

    Pour l'attribut "id", il va falloir faire un concat('niv1', numéro)

    Pour calculer le numéro, apparemment un count(preceding::niv1) + 1 devrait faire l'affaire.
    Il reste plus qu'à le formater avec un zéro devant si nécessaire, en utilisant format-number(numéro, '0#')

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 16
    Points : 5
    Points
    5
    Par défaut création d'attributs multiples
    Merci pour ta réponse qui m'as permis d'avancer

    J'en suis arrivé à l'xsl ci-dessous qui, à partir de :
    <niv1>

    me donne :

    <niv1 id="x" folio="x"/>

    ce qui est déjà pas mal mais pour que ce soit vraiment bien je voudrais obtenir :

    <niv1 id="niv1xx" folio="x"/>

    donc niv1 accolé au numéro d'ordre du nœud <niv1>
    le numéro d'ordre sous la forme : 01,02…10,11 etc.

    et comme tu peux le constater, je ne vois pas comment ajouter niv1 devant la numérotation.

    Encore merci pour ton aide
    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
     
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:template match="node() | @*">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
     
        <!-- éléments part et chap: donner le @folio du rp précédent -->
        <xsl:template match="niv1">
            <xsl:copy>
                <xsl:attribute name="id">
     
                    <xsl:value-of select="count(preceding::niv1)+1"/>
     
    <!--   <xsl:value-of select="format-number(numéro,'0#')"/>  -->       
     
                </xsl:attribute>
                <xsl:attribute name="folio">
                    <xsl:value-of select="preceding::rp[1]/@folio"/>
                </xsl:attribute>
                <xsl:apply-templates/>
            </xsl:copy>
        </xsl:template>
     
        <!-- tout le reste : copier tel que et appeler les templates des enfants -->
        <xsl:template match="*|@*">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    </xsl:stylesheet>

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Ben, je te l'ai dit au-dessus, concat().

    Pour formater un nombre et lui forcer deux chiffres, je te l'ai dit aussi, format-number()

    donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    concat('truc', format-number(expressionQuiCompte, '0#'))

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 16
    Points : 5
    Points
    5
    Par défaut création d'attributs multiples
    Effectivement, mais j'avais essayé l'expression suivante :

    <xsl:value-of select="concat('niv1', format-number(count(preceding::niv1)+1, '0#'))"/>

    qui ne me retourne plus rien à partir de la première occurrence de "niv1"

    j'aurais loupé quelque-chose au niveau de la syntaxe??!!

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 16
    Points : 5
    Points
    5
    Par défaut création d'attribut multiples
    Je crois que j'ai trouvé

    Avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="concat('niv1',format-number(count(preceding::niv1)+1, '00'))"/>
    J'ai un zéro devant 1 à 9

    Merci pour ton aide

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Ah, en effet. Je sais pas pourquoi je faisais toujours '0#', c'est accepté par certains moteurs, mais ça n'a pas l'air correct.

Discussions similaires

  1. [XSLT] Création d'un filtre selon la valeur d'un attribut
    Par lemok dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 07/05/2007, 17h13
  2. Création d’un attribut de session
    Par ollivier dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 29/04/2006, 15h27
  3. [XSLT] Création de fichier XML dynamique avec PHP
    Par daninho dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 02/02/2006, 11h18
  4. [DOM XML][XSLT] Création d'un document XML avec PHP
    Par ToxiZz dans le forum Bibliothèques et frameworks
    Réponses: 21
    Dernier message: 16/01/2006, 17h44
  5. [XSLT] Dédoublonner des attributs
    Par 242 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 10/11/2005, 15h44

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