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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

+ 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