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] Template imbriqué dans un if


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut [XSLT] Template imbriqué dans un if
    Bonjour tt le monde,
    Je suis novice dans le domaine du xsl &CO alors svp aidez moi.
    Voila quand je lance la transformation j'ai un message d'erreur:
    XSTE0010:an xsl:if element must not contain an xsl:template element.
    mon fichier xml à transformer a cette forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <A>
      <B>
         <C>
           .
            .
           .
         </C>
      </B>
    </A>
    ma transfo est de la forme:

    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
    <xsl:template match="C">
        <xsl:for-each select="../B">
           <xsl:if test=" "> (LE 1ER IF)
              <xsl:template match="C" priority="1">
                 <xsl:copy>
     
     
                 </xsl:copy>
              </xsl:template >
          </xsl:if >
          <xsl:if test=" "> (LE 2EME IF)
              <xsl:template match="C" priority="1">
                 <xsl:copy>
     
     
                 </xsl:copy>
              </xsl:template >
           </xsl:if >
     </xsl:for-each>
    <xsl:template>
    quoi dois je changer??!!

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Bonjour,

    les template imbriqués sont interdits...

    retire les balises template dans le if et laisse seulement leur contenu

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Swoög
    Bonjour,

    les template imbriqués sont interdits...

    retire les balises template dans le if et laisse seulement leur contenu
    Je te remercie pour ta réponse, c'est sympa de ta part.

    ben j'ai essayé d'enlever les xml:template mais ça ne donne pas le resultat que je cherche!!
    je vais essayer de me casser plus la tête afin de trouver la solution.
    si vous avez d'autres propositions n'hésitez pas.

    bye

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    tu as essaye xsl:choice au lieu de if ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Swoög
    tu as essaye xsl:choice au lieu de if ?
    Oui j'ai essayé mais j'ai le meme message d'erreur!!
    moi je veux appliquer mon <xsl:copy> sur le noeud <C> mais vue que je monte d'un noeud dans mon <xsl:for-each> je dois fair un template pour appliquer mon <xsl:copy>.
    le problème ne serait il pas due à XSLT 2.0?!!

  6. #6
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Citation Envoyé par LeNouv_O
    le problème ne serait il pas due à XSLT 2.0?!!
    Non, ce code n'est valide dans aucune version.

    On ne peut pas imbriquer les templates.On les appelle via
    - des apply templates
    ou
    - des call-templates


    Montre le resultat que tu soughaite via ce template ce sera plus simple de te corriger

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Voila, j'ai essayé de séparer mes "templates " de mes" if" et j'ai utilisé des call-templates le pb que j'ai maintenent c'est que j'ai une erreur d'ambiguité vue que mes deux templates s'applique sur des noeuds qui ont les meme noms bien que les noms des templates sont differents:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <xsl:template name="toto" match= "C">
     
    </xsl:template>
    <xsl:template name="titi" match= "C">
     
    </xsl:template>
    je suis entrain de voir si je peux regler ce pb avec xsl:with-param mais bon je suis vraiment out la :s

  8. #8
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Citation Envoyé par LeNouv_O
    Voila, j'ai essayé de séparer mes "templates " de mes" if" et j'ai utilisé des call-templates le pb que j'ai maintenent c'est que j'ai une erreur d'ambiguité vue que mes deux templates s'applique sur des noeuds qui ont les meme noms bien que les noms des templates sont differents:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <xsl:template name="toto" match= "C">
     
    </xsl:template>
    <xsl:template name="titi" match= "C">
     
    </xsl:template>
    je suis entrain de voir si je peux regler ce pb avec xsl:with-param mais bon je suis vraiment out la :s
    On ne cumule pas name et match
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ....
    <xsl:apply-templates mode="toto" select="C"/>
    <xsl:apply-templates mode="titi" select="C"/>
    ....
    <xsl:template mode="toto" match= "C">
     
    </xsl:template>
    <xsl:template mode="titi" match= "C">
     
    </xsl:template>

    mais ca n'explique pas un paquet de chose


    <xsl:template match="C">
    <xsl:for-each select="../B">
    <xsl:if test=" "> (LE 1ER IF)
    <xsl:template match="C" priority="1">
    <xsl:copy>


    </xsl:copy>
    </xsl:template >
    </xsl:if >
    <xsl:if test=" "> (LE 2EME IF)
    <xsl:template match="C" priority="1">
    <xsl:copy>


    </xsl:copy>
    </xsl:template >
    </xsl:if >
    </xsl:for-each>
    <xsl:template>
    tu as trois template qui match C ???

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Voila je vous donne plus de precisions.
    mon 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <A>
      <B>arbre</B>
         <C id="01" nom="cerisier">
            .
             .
           .
         </C>
     
    </A>
     <A>
      <B>construction</B>
         <C id="02" nom"maison">
            .
            .
           .
         </C>
    </A>
    <A>
      <B>construction</B>
         <C id="02" nom"villa">
           .
            .
           .
         </C>
    </A>
    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
    <xsl:template match="C">
     <xsl:for-each select="../B">
      <xsl:if test=" x=arbre"> (LE 1ER IF)
        <xsl:template match="C" priority="1">
          <xsl:copy>
     
     
           </xsl:copy>
         </xsl:template >
       </xsl:if >
       <xsl:if test=" x=construction"> (LE 2EME IF)
         <xsl:template match="C" priority="1">
            <xsl:copy>
     
     
            </xsl:copy>
        </xsl:template >
      </xsl:if >
     </xsl:for-each>
    </xsl:template >
    je ne sais pas si c'est plus claire? moi j'essaye d'appliquer certaines regles pour la 1 ere condition et d'autres regles pour la seconde condition. j'ai fait sortire mes 2 templates du(if) et je les appelle avec des call-template..
    mais vue que c'est 2 templates correspondent à un noeud (avec deux noms differents aussi) j'ai un problème avec mes call-template car il applique les meme regles pour mes deux call-template!!

  10. #10
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    847
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 847
    Points : 841
    Points
    841
    Par défaut
    j'espere que tu as un niveu au dessus de "A" dans ton xml!!!! sinon ton xml n'est pas valide.

    sinon peut tu dire ce que tu veux faire exactement avec ton xml...peut être qu'on peut le faire autrement que par des for-each et des multitides de if(privilegie les apply-templates au for-each)


    voila

  11. #11
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par valal
    j'espere que tu as un niveu au dessus de "A" dans ton xml!!!! sinon ton xml n'est pas valide.
    mal formé, pas non valide c'est pas tout à fait pareil ^^

    Citation Envoyé par valal
    sinon peut tu dire ce que tu veux faire exactement avec ton xml...peut être qu'on peut le faire autrement que par des for-each et des multitides de if(privilegie les apply-templates au for-each)
    +1

    esaie un truc dans ce 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
    <xsl:template match="B">
       <xsl:choose>
          <xsl:when test=". = 'arbre'"><xsl:apply-template select="following-sibling::C" mode="arbre"/></xsl:when>
          <xsl:when test=". = 'construction'"><xsl:apply-template select="following-sibling::C" mode="construction"/></xsl:when>
          <xsl:otherwise>Element B inconnu</xsl:otherwise>
       </xsl:choose>
    </xsl:template>
     
    <xsl:template match="C" mode="arbre">
       <!-- traitement pour arbre -->
    </xsl:template>
     
    <xsl:template match="C" mode="construction">
       <!-- traitement pour construction -->
    </xsl:template>

  12. #12
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    847
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 847
    Points : 841
    Points
    841
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mal formé, pas non valide  c'est pas tout à fait pareil ^^

    oups j'ai offensé Swoög (cette fois j'ai bien écrit ton pseudo
    méa culpa....c'était la fin de la journée (valide = rapport à dtd et schema).

    sinon je suis d'accord avec ce que tu as proposé.

  13. #13
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    C'est simplement que ce sont deux notions séparées et qu'il est très important de ne pas les confondre

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Salut tt le monde,
    @Swoöng: ben j'ai essayé ce que tu m'as proposé et ça marche merci bcp à toi et aux autres forumistes .
    Je reviendrai vous casser la tete un peu plus tard lol .
    Bonne journée.
    ah j'ai une dernière question: je bosse sur notpad et c'est pas super super comme environement..connaissez vs un editeur xslt gratuit? (à part xm-spy qui est gratuit pendant 1mois )

  15. #15
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    Citation Envoyé par LeNouv_O
    ah j'ai une dernière question: je bosse sur notpad et c'est pas super super comme environement..connaissez vs un editeur xslt gratuit? (à part xm-spy qui est gratuit pendant 1mois )
    La version Home de XMLSpy est gratuite et son usage n'est pas limité dans le temps.

  16. #16
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    847
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 847
    Points : 841
    Points
    841
    Par défaut
    est tu sur que xml spy home édition est gratuit!!!!


    http://www.developpez.net/forums/sho...?t=3980&page=2

    je connais dépuis un petit moment mais j'en connais pas de version gratuite!
    un lien peut être?

  17. #17
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    j'ai trouvé un lien pour la version 2004 : http://www.altova.com/download_archive.html

    rien pour la 2006 par contre la version Home 2006 n'existerait plus ?

  18. #18
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par Swoög
    rien pour la 2006 par contre la version Home 2006 n'existerait plus ?
    http://www.altova.com/download_components.html

  19. #19
    Membre éclairé
    Inscrit en
    Octobre 2005
    Messages
    847
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 847
    Points : 841
    Points
    841
    Par défaut
    merci pour les liens......j'ai utilisé plusieurs fois et j'avais laissé tombé à cause de sa non-gratuité

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 21
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Swoög
    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
    <xsl:template match="B">
       <xsl:choose>
          <xsl:when test=". = 'arbre'"><xsl:apply-template select="following-sibling::C" mode="arbre"/></xsl:when>
          <xsl:when test=". = 'construction'"><xsl:apply-template select="following-sibling::C" mode="construction"/></xsl:when>
          <xsl:otherwise>Element B inconnu</xsl:otherwise>
       </xsl:choose>
    </xsl:template>
     
    <xsl:template match="C" mode="arbre">
       <!-- traitement pour arbre -->
    </xsl:template>
     
    <xsl:template match="C" mode="construction">
       <!-- traitement pour construction -->
    </xsl:template>
    Salut tt le monde,
    et oui je suis de retour :s
    voila la dernière foi quand j'ai essayé ce que tu m'as proposé je pensé que ça marché et je suis passé à autre chose mais la je viens de me rendre compte que ça marche partiellement car au lieu d'appliquer les regles decrites dans le template sur les noeuds "C" . Il me crée des nouveaux noeuds "C" qui contiennent les attributs que j'ai decrit dans les templates!!! moi je pensais que quand je mettais un copy des attributs dans un template il copie les attributs dans les noeuds qui existent deja!!? c'est ça non!?
    merci d'avance.

Discussions similaires

  1. [XSLT] Suis perdu dans template:match
    Par kabkab dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 11/05/2007, 15h58
  2. [xslt] For-each dans template avec format XML (row)
    Par Steff1985 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 17/11/2005, 11h14
  3. Réponses: 2
    Dernier message: 02/08/2005, 11h44
  4. Probleme de Jointures imbriquées dans une requête
    Par Crevin dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/04/2005, 11h05
  5. [XSLT] template
    Par demo dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 09/09/2002, 11h31

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