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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    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#')
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    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
    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 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    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#'))
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    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
    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
    Membre averti
    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
    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

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