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 :

Création de noeud sous condition [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17
    Par défaut Création de noeud sous condition
    Bonjour à tous,

    Je suis débutant en xslt.
    Je souhaiterai créer des noeuds à un endroit précis dans mon arbre et à la seule condition que dans mon source il y en ait moins de 7.
    Un exemple sera plus parlant. Disons que mon source soit du type:

    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
     
    <lili>
      <toto>
        <bob>Joe</bob>
        <dudu>
          <duration>5</duration>
          <duration>6</duration>
          <duration>2</duration>
        </dudu>
      </toto>
      <toto>
        <bob>Bill</bob>
        <dudu>
          <duration>154</duration>
          <duration>12</duration>
        </dudu>
      </toto>
    </lili>

    je voudrais que mon xml de sortie ressemble à ça:

    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
     
    <lili>
      <toto>
        <bob>Joe</bob>
        <dudu>
          <duration>5</duration>
          <duration>6</duration>
          <duration>2</duration>
          <duration>0</duration>
          <duration>0</duration>
          <duration>0</duration>
          <duration>0</duration>
        </dudu>
      </toto>
      <toto>
        <bob>Bill</bob>
        <dudu>
          <duration>154</duration>
          <duration>12</duration>
          <duration>0</duration>
          <duration>0</duration>
          <duration>0</duration>
          <duration>0</duration>
          <duration>0</duration>
        </dudu>
      </toto>
    </lili
    En gros, je veux qu'en sortie, chaque élément <dudu> ait 7 <duration>. Si dans mon source j'ai déjà 7 <duration>, il faudra alors ne rien faire.

    J'imagine que cela est possible mais je n'arrive pas à le mettre en oeuvre.

    Merci d'avance

  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
    C'est possible mais pas spécialement simple, parce qu'en XSLT 1.0 on ne peut pas faire de boucle "de 1 à 7". On ne peut boucler que sur des éléments, or là justement, il y a moins d'éléments que tu ne veux en créer.

    Une solution simple, mais chiante, est de créer un template nommé avec un paramètre d'index :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <xsl:template name="copyOrCreateDuration">
      <xsl:param name="index"/>
      <xsl:choose>
        <xsl:when test="duration[$index]">
          <xsl:copy-of select="duration[$index]"/>
        </xsl:when>
        <xsl:otherwise>
          <duration>0</duration>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:template>
    Et que tu appelles 7 fois en commençant par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:call-template name="copyOrCreateDuration">
      <xsl:with-param name="index" select="1"/>
    </xsl:call-template>
    Si tu veux éviter de l'appeler 7 fois, il faudra faire un template récursif qui incrémente l'index à chaque récursion, et s'arrête à la 7e.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17
    Par défaut
    Merci pour ta réponse.
    Je ne connais les différences de version de xslt. D'après ta réponse, si je passais en version 2.0, il y aurait un moyen plus simple pour résoudre mon problème?

    Sinon, je viens d'esayer ta solution mais ca ne fonctionne pas. Je suis à 99% sûr que c'est parce que je suis un boulet. Je ne connais vraiment pas xslt.
    Voilà ma feuille de style:

    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
     
    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    	<xsl:template match="*|@*">
    		<xsl:copy>
    			<xsl:apply-templates select="@*"/>
    			<xsl:apply-templates select="node()"/>
    			<xsl:apply-templates/>
    		</xsl:copy>
    	</xsl:template>
    	<xsl:template match="/documents/document/planDeFinancement">
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="1"/>
    		</xsl:call-template>
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="2"/>
    		</xsl:call-template>
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="3"/>
    		</xsl:call-template>
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="4"/>
    		</xsl:call-template>
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="5"/>
    		</xsl:call-template>
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="6"/>
    		</xsl:call-template>
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="7"/>
    		</xsl:call-template>
    	</xsl:template>
     
    	<xsl:template name="copyOrCreateDuration">
    		<xsl:param name="index"/>
    		<xsl:choose>
    			<xsl:when test="duration[$index]">
    				<xsl:copy-of select="duration[$index]"/>
    			</xsl:when>
    			<xsl:otherwise>
    				<duration>0</duration>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
    </xsl:stylesheet>
    En fait, les éléments <duration> sont des enfants de <planDeFinancement> qui lui-même peut être répété.
    Pourrais-tu m'expliquer ce que j'ai mal fait?

    Merci encore

  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
    Citation Envoyé par leoetevan Voir le message
    Je ne connais les différences de version de xslt. D'après ta réponse, si je passais en version 2.0, il y aurait un moyen plus simple pour résoudre mon problème?
    Oui. Mais je connais assez mal les syntaxes de XSLT 2.0. Je sais qu'il résout ce genre de problèmes triviaux, mais je ne sais pas vraiment comment.
    Citation Envoyé par leoetevan Voir le message
    Sinon, je viens d'esayer ta solution mais ca ne fonctionne pas. Je suis à 99% sûr que c'est parce que je suis un boulet. Je ne connais vraiment pas xslt.
    Chez moi, ça donne quelque d'assez proche de ce que tu as demandé.
    Peux-tu nous décrire un peu ce que tu obtiens et pourquoi ça ne va pas ?

    (Il y a effectivement quelques problèmes, mais on va les regarder un par un. Et puis, ils sont en dehors du code que je t'ai passé.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17
    Par défaut
    En fait, c'est assez simple, j'ai en sortie de ma transformation, uniquement la balise d'entete du fichier xml.
    J'essaye pas mal de chose depuis tout à l'heure mais rien n'y fait.

    voici le code que j'utilise:

    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
     
    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    	<xsl:output method="xml" />
     
    	<xsl:template match="/">
    		<xsl:copy>
    			<xsl:apply-templates select="@*"/>
    			<xsl:apply-templates select="node()"/>
    			<xsl:apply-templates/>
    		</xsl:copy>
    	</xsl:template>
     
    	<xsl:template match="/rateSheets/rateSheet/financialPlanStep[durationDatas]">
    		<xsl:call-template name="boucle" />
    	</xsl:template>
     
    	<xsl:template name="boucle">
    		<xsl:param name="debut" select="1" />
    		<xsl:param name="fin" select="7" />
      		<xsl:text>bidule</xsl:text>
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="$debut"/>
    		</xsl:call-template>
     
    		<xsl:if test="$debut &lt; $fin">
    			<xsl:call-template name="boucle">
    				<xsl:with-param name="debut" select="($debut)+1" />
    				<xsl:with-param name="fin" select="$fin" />
    			</xsl:call-template>
      		</xsl:if>
    	</xsl:template>
     
    	<xsl:template name="copyOrCreateDuration">
    		<xsl:param name="index"/>
    		<xsl:choose>
    			<xsl:when test="duration[$index]">
    				<xsl:copy-of select="duration[$index]"/>
    			</xsl:when>
    			<xsl:otherwise>
    				<duration>0</duration>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
    </xsl:stylesheet>
    Et voilà ce que ça me sort:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?xml version="1.0" encoding="utf-8"?>

  6. #6
    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
    Ouais mais il faudrait que tu arrêtes de tout changer tout le temps, en fait.

    Au début c'était
    /documents/document/planDeFinancement
    et maintenant c'est
    /rateSheets/rateSheet/financialPlanStep[durationDatas]

    Au début c'était appeler 7 fois le template.
    et maintenant c'est une boucle.

    Je fais comment pour savoir où tu en es, moi ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17
    Par défaut
    Excuse-moi.
    la boucle, c'est juste pour éviter de retaper le code n fois.
    Ca ne bougera plus.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17
    Par défaut
    En fait, /documents/document/planDeFinancement et /rateSheets/rateSheet/financialPlanStep c'est la meme chose. Les <duration> sont des éléments fils de <financialPlanStep>

  9. #9
    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 ne suis pas plus avancé -_-°.
    - Non c'est pas la même chose.
    - Et <durationDatas> c'est quoi ?
    - On n'arrivera à rien si on essaie les méthodes compliquées avant de réussir les méthodes simples.
    - Si ton code précédent te sort vraiment <?xml version="1.0" encoding="utf-8"?>, alors ce n'est pas ton fichier XSLT qui a une erreur, c'est la manière dont tu l'appelles. Quoiqu'il arrive ce XSLT aurait copié la racine, et donc elle aurait dû être reproduite.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17
    Par défaut
    J'avais francisé mon cas. Les durationDatas c'est la meme chose que duration dans mon premier code.
    Ma structure est la suvante:
    rateSheets
    ratesheet+
    financialPlanStep+
    durationDatas+

    Dans mon premier exemple, j'avais juste francisé les noms ce qui me donnait:
    documents
    document+
    planDeFinancement+
    duration+

    Je viens de réessayer avec le premier code que j'avais mis pour éviter les complications. Tu as raison, autant faire fonctionner le simple avant d'attaquer plus compliqué.
    Effectivement, ça me génère le meme code que j'ai dans le fichier source.
    Pour tester ma feuille xslt, j'utilise editiX

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17
    Par défaut
    Bon, pour simplifier au maximum les choses, je propose de reprendre à zero avec un exemple très simple.

    Voici donc un fichier xml source:
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <personnes>
    	<personne>
    		<nom>dupont</nom>
    		<prenom>jul</prenom>
    		<prenom>robert</prenom>
    	</personne>
    	<personne>
    		<nom>martin</nom>
    		<prenom>bertrand</prenom>
    		<prenom>stephane</prenom>
    		<prenom>martin</prenom>
    	</personne>
    </personnes>
    un fichier de transformation:
    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
     
    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    	<xsl:template match="*|@*">
    		<xsl:copy>
    			<xsl:apply-templates select="@*"/>
    			<xsl:apply-templates select="node()"/>
    		</xsl:copy>
     
    	</xsl:template>
    	<xsl:template match="/personnes/personne">
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="1"/>
    		</xsl:call-template>
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="2"/>
    		</xsl:call-template>
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="3"/>
    		</xsl:call-template>
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="4"/>
    		</xsl:call-template>
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="5"/>
    		</xsl:call-template>
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="6"/>
    		</xsl:call-template>
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="7"/>
    		</xsl:call-template>
    	</xsl:template>
     
    	<xsl:template name="copyOrCreateDuration">
    		<xsl:param name="index"/>
    		<xsl:choose>
    			<xsl:when test="prenom[$index]">
    				<xsl:copy-of select="prenom[$index]"/>
    			</xsl:when>
    			<xsl:otherwise>
    				<prenom>0</prenom>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
    </xsl:stylesheet>
    et voici le résultat obtenu:
    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
     
    <?xml version="1.0" encoding="utf-8"?>
    <personnes>
    	<prenom>jul</prenom>
    	<prenom>robert</prenom>
    	<prenom>0</prenom>
    	<prenom>0</prenom>
    	<prenom>0</prenom>
    	<prenom>0</prenom>
    	<prenom>0</prenom>
    	<prenom>bertrand</prenom>
    	<prenom>stephane</prenom>
    	<prenom>martin</prenom>
    	<prenom>0</prenom>
    	<prenom>0</prenom>
    	<prenom>0</prenom>
    	<prenom>0</prenom>
    </personnes>

  12. #12
    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
    C'est bien de repartir sur un exemple complet (techniquement il faut toujours travailler sur un exemple complet, simple et court, mais il y a tellement de gens qui ne le font pas...)
    C'est bien de donner le résultat.
    Mais il fallait aussi dire en quoi le résultat ne plaît pas.

    - il manque les balises <personne>
    => Parce que tu ne les as pas créées.
    Dans ton premier template, tu l'as entouré de <xsl:copy>. C'est pour ça que les balises que tu rencontres sont créées au même nom.
    Mais tu ne le fais pas dans le deuxième. Du coup, la balise <personne>, sur laquelle s'applique ce template, n'est pas créée.

    - il manque les balises <nom>
    => Pareil, tu les as pas créées.
    Dans ton premier template tu prends la peine d'appeler <xsl:call-templates> sur tout le contenu du match, ce qui permet donc de le traiter.
    Mais dans le second match, comme on doit faire un traitement particulier sur <prenom>, on ne peut pas juste faire <xsl:call-templates> sur tout le contenu. Donc on l'a pas fait.
    Mais <nom> ne va pas se copier tout seul. Lui il faut le traiter comme on traite tous les autres.
    En appelant <xsl:call-templates select="nom"/> <xsl:apply-templates select="nom"/>
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17
    Par défaut
    Merci pour ta réponse. Je vois bien ce que tu veux dire mais je ne vois pas comment le mettre en oeuvre...

  14. #14
    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
    Citation Envoyé par leoetevan Voir le message
    Merci pour ta réponse. Je vois bien ce que tu veux dire mais je ne vois pas comment le mettre en oeuvre...
    Pourtant, je t'ai donné le nom des balises à utiliser, et je t'ai dit de t'inspirer du premier template, que tu n'a eu aucun mal à mettre en œuvre.

    C'est la même syntaxe, le même fonctionnement...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17
    Par défaut
    Le problème est pour la balise <personne>.
    Voilà ma feuille de style:
    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
    53
     
    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    	<xsl:template match="*|@*">
    		<xsl:copy>
    			<xsl:apply-templates select="@*"/>
    			<xsl:apply-templates select="node()"/>
    		</xsl:copy>
     
    	</xsl:template>
    	<xsl:template match="/personnes/personne">
    		<xsl:call-template name="nom"/>  
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="1"/>
    		</xsl:call-template>
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="2"/>
    		</xsl:call-template>
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="3"/>
    		</xsl:call-template>
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="4"/>
    		</xsl:call-template>
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="5"/>
    		</xsl:call-template>
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="6"/>
    		</xsl:call-template>
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="7"/>
    		</xsl:call-template>
    	</xsl:template>
     
    	<xsl:template name="copyOrCreateDuration">
    		<xsl:param name="index"/>
    		<xsl:choose>
    			<xsl:when test="prenom[$index]">
    				<xsl:copy-of select="prenom[$index]"/>
    			</xsl:when>
    			<xsl:otherwise>
    				<prenom>0</prenom>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
    	<xsl:template name="nom">
    		<xsl:copy>
    			<xsl:apply-templates select="@*"/>
    			<xsl:apply-templates select="node()"/>
    		</xsl:copy>
    	</xsl:template>
    </xsl:stylesheet>
    Et le résultat:
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <personnes>
    	<personne>
    		<nom>dupont</nom>
    		<prenom>jul</prenom>
    		<prenom>robert</prenom>
    	</personne>
    	<prenom>jul</prenom>
    	<prenom>robert</prenom>
    	<prenom>0</prenom>
    	<prenom>0</prenom>
    	<prenom>0</prenom>
    	<prenom>0</prenom>
    	<prenom>0</prenom>
    	<personne>
    		<nom>martin</nom>
    		<prenom>bertrand</prenom>
    		<prenom>stephane</prenom>
    		<prenom>marc</prenom>
    	</personne>
    	<prenom>bertrand</prenom>
    	<prenom>stephane</prenom>
    	<prenom>marc</prenom>
    	<prenom>0</prenom>
    	<prenom>0</prenom>
    	<prenom>0</prenom>
    	<prenom>0</prenom>
    </personnes>
    Je ne m'en sors pas. Ca fait deux jour que je suis sur ce problème et le xslt est déjà en train de me sortir par les yeux...

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17
    Par défaut
    Oh punaise, ça fonctionne!!!
    Merci énormément pour ton aide.
    Bon, c'est pas encore gagné parce qu'il faut que j'applique ça à mon "vrai" cas et que je gère la boucle mais c'est un bon début. J'ai cru que je ne m'en sortirai jamais...

    Voici donc ma feuille de style:
    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
     
    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    	<xsl:template match="*|@*">
    		<xsl:copy>
    			<xsl:apply-templates select="@*"/>
    			<xsl:apply-templates select="node()"/>
    		</xsl:copy>
    	</xsl:template>
    	<xsl:template match="/personnes/personne">
    		<xsl:copy>
    			<xsl:apply-templates select="nom"/>
    			<xsl:call-template name="copyOrCreateDuration">
    				<xsl:with-param name="index" select="1"/>
    			</xsl:call-template>
    			<xsl:call-template name="copyOrCreateDuration">
    				<xsl:with-param name="index" select="2"/>
    			</xsl:call-template>
    			<xsl:call-template name="copyOrCreateDuration">
    				<xsl:with-param name="index" select="3"/>
    			</xsl:call-template>
    			<xsl:call-template name="copyOrCreateDuration">
    				<xsl:with-param name="index" select="4"/>
    			</xsl:call-template>
    			<xsl:call-template name="copyOrCreateDuration">
    				<xsl:with-param name="index" select="5"/>
    			</xsl:call-template>
    			<xsl:call-template name="copyOrCreateDuration">
    				<xsl:with-param name="index" select="6"/>
    			</xsl:call-template>
    			<xsl:call-template name="copyOrCreateDuration">
    				<xsl:with-param name="index" select="7"/>
    			</xsl:call-template>
    		</xsl:copy>
    	</xsl:template>
     
    	<xsl:template name="copyOrCreateDuration">
    		<xsl:param name="index"/>
    		<xsl:choose>
    			<xsl:when test="prenom[$index]">
    				<xsl:copy-of select="prenom[$index]"/>
    			</xsl:when>
    			<xsl:otherwise>
    				<prenom>0</prenom>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
    </xsl:stylesheet>

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17
    Par défaut
    Et pour finir avec mon code 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    	<xsl:template match="*|@*">
    		<xsl:copy>
    			<xsl:apply-templates select="@*"/>
    			<xsl:apply-templates select="node()"/>
    		</xsl:copy>
    	</xsl:template>
    	<xsl:template match="/personnes/personne">
    		<xsl:copy>
    			<xsl:apply-templates select="nom"/>
    			<xsl:call-template name="boucle" />
    		</xsl:copy>
    	</xsl:template>
    	<xsl:template name="boucle">
    		<xsl:param name="debut" select="1" />
    		<xsl:param name="fin" select="7" />
     
    		<xsl:call-template name="copyOrCreateDuration">
    			<xsl:with-param name="index" select="$debut"/>
    		</xsl:call-template>
     
    	    	<xsl:if test="$debut &lt; $fin">
    			<xsl:call-template name="boucle">
    				<xsl:with-param name="debut" select="($debut)+1" />
    				<xsl:with-param name="fin" select="$fin" />
    			</xsl:call-template>
    	    	</xsl:if>
    	</xsl:template>
     
    	<xsl:template name="copyOrCreateDuration">
    		<xsl:param name="index"/>
    		<xsl:choose>
    			<xsl:when test="prenom[$index]">
    				<xsl:copy-of select="prenom[$index]"/>
    			</xsl:when>
    			<xsl:otherwise>
    				<prenom>0</prenom>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
    </xsl:stylesheet>

  18. #18
    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
    Bien joué. Il n'y a pas grand-chose à améliorer.

    - Tu peux remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:apply-templates select="node()"/>
    par
    C'est un raccourci.

    - Tu n'as pas forcément besoin de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="/personnes/personne">
    Tu pourrais te contenter de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:template match="personne">
    Sauf si c'est vraiment important de ne prendre que les <personne> qui sont fils directes de <personne>, qui lui-même doit être l'élément racine.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 17
    Par défaut
    Merci pour ces derniers tuyaux et pour tout le reste d'ailleurs. Tu m'as vraiment été d'un grand secours.
    Bonne continuation

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

Discussions similaires

  1. [AC-2000] Interdire la création d'enregistrement sous condition
    Par Gabout dans le forum IHM
    Réponses: 3
    Dernier message: 02/07/2009, 22h08
  2. [XL-2007] Création de feuille sous condition
    Par stargates dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 06/06/2009, 14h49
  3. Requête SQL avec création de table sous condition
    Par misig dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 04/11/2007, 08h58
  4. Création d'une feuille sous condition
    Par PyMon dans le forum Excel
    Réponses: 1
    Dernier message: 24/07/2007, 12h22
  5. Création d'une feuille sous condition
    Par PyMon dans le forum Excel
    Réponses: 4
    Dernier message: 19/07/2007, 16h14

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