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] selection du bon template


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Par défaut [XSLT] selection du bon template
    Bonjour,

    je suis novice en XSL et j'aimerais savoir si il est possible de choisir le template qu'on voudrait appliquer.
    Je m'explique par un exemple.
    J'ai les fichiers xml suivant:

    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"?>
    <ihg version="3.0.0.0">
        <session_data>
                <issuer>
                    <fiscal_year_start_date>2006-01-12</fiscal_year_start_date>
                </issuer>
        </session_data>
        <derivatives>
            <cb_option>
                <maturity_date>2008-01-01</maturity_date>
                <convertible_bond>
                    <bond_terms>
                        <issue_date>2000-01-01</issue_date>
                    </bond_terms>               
                </convertible_bond>            
            </cb_option>
        </derivatives>
    </ihg>
    et:

    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
    <?xml version="1.0"?>
    <ihg version="3.0.0.0">
        <session_data>
                <issuer>
                    <fiscal_year_start_date>2006-01-12</fiscal_year_start_date>
                </issuer>
        </session_data>
        <derivatives>
                <convertible_bond>
                    <bond_terms>
                        <issue_date>2000-01-01</issue_date>
                    </bond_terms>               
                </convertible_bond>            
        </derivatives>
    </ihg>
    comme on s'en apperçoit "convertible_bond" est dans le premier cas un sous fils de "cb_option" et ne l'est pas dans l'autre cas.

    Ce que j'aimerais faire c'est faire un test de ce type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:choose>
    <xsl:when test="name(ihg/derivatives/*[1])"='cb_option'>
    <xsl:template match="ihg/derivatives/*[1]/convertible_bond">
    </xsl:when>
    <xsl:otherwise>
    <xsl:template match="ihg/derivatives/*[1]/convertible_bond">
    </xsl:otherwise>
    </xsl:choose>
    Est ce possible et comment svp?
    si ce n'est pas possible, comment puis-je faire?

    merci d'avance de votre aide.

  2. #2
    Membre émérite
    Profil pro
    Responsable Dev
    Inscrit en
    Décembre 2003
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable Dev

    Informations forums :
    Inscription : Décembre 2003
    Messages : 788
    Par défaut
    en faite tu fais deux templates
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <xsl:template select="cb_option/convertible_bond">
    </xsl:template>
     
    <xsl:template select="convertible_bond">
    </xsl:template>
    En faite en xslt le choix du bon template ce fait via la priorité des règles des select: plus une règle est précise plus elle sera prioritaire. On peux modifier la valeur de priorité soit même (utilisation de l'attribut priority dans la balise template)

  3. #3
    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
    Par défaut
    Citation Envoyé par fraoustin
    En faite en xslt le choix du bon template ce fait via la priorité des règles des select: plus une règle est précise plus elle sera prioritaire.
    C'est une légende urbaine très répandue Non je suis méchant, c'est syntaxiquement exact mais généralement très mal interprété.
    Pour cet exemple ,un chemin avec un axe enfant est plus prioritaire qu'un chemin sans, mais entre deux chemin possédant ces axes aucune priorité autre que l'ordre (le dernier déclaré s'applique en priorité)

    un exemple
    soit le xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="utf-8"?>
    <R>
    	<b>
    		<a>b</a>
    	</b>
    	<c>
    		<b>
    			<a>c</a>
    		</b>
    	</c>
    </R>
    si j'applique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="text"/>
    	<xsl:template match="c/b/a">
    	test 1	
    	</xsl:template>
    	<xsl:template match="b/a">
    		test 2
    	</xsl:template>
    </xsl:stylesheet>
    j'ai comme resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		test 2
     
    		test 2
    parce que même ci c/b/a est plus precis, il n'est pas plus prioritaire que b/a (qui possède aussi au moins un axe child) et que celui ci est déclaré en dernier

    Citation Envoyé par fraoustin
    On peux modifier la valeur de priorité soit même (utilisation de l'attribut priority dans la balise template)
    c'est l'utilisation la plus sur

    on trouve les regles de priorité ici
    http://www.w3.org/TR/xslt#conflict

  4. #4
    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
    Par défaut
    Citation Envoyé par boubou_93

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:choose>
    <xsl:when test="name(ihg/derivatives/*[1])"='cb_option'>
    <xsl:template match="ihg/derivatives/*[1]/convertible_bond">
    </xsl:when>
    <xsl:otherwise>
    <xsl:template match="ihg/derivatives/*[1]/convertible_bond">
    </xsl:otherwise>
    </xsl:choose>
    Pour info , un template ne peut se trouver que sous l'element xsl:stylesheet

    c'est un apply-templates que tu peux placé dans xsl:choose et la tu peux en effet jouer sur son select

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Par défaut
    Justement je ne peux pas faire ce que tu dis car je duplique mon code dans ce cas. Moi ce que je voudrais faire c'est justement traiter tout les fils de "convertible_bond" une seul fois. Je ne sais pas si je suis très clair. Si je fais ce que tu me dis, sachant que les règles associées à un template s'applique entre la définition du template et la fin de celui-ci, je devrais faire deux fois le même travail. Est-ce que tu me comprends?

  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
    Par défaut
    Citation Envoyé par boubou_93
    Justement je ne peux pas faire ce que tu dis car je duplique mon code dans ce cas. Moi ce que je voudrais faire c'est justement traiter tout les fils de "convertible_bond" une seul fois. Je ne sais pas si je suis très clair. Si je fais ce que tu me dis, sachant que les règles associées à un template s'applique entre la définition du template et la fin de celui-ci, je devrais faire deux fois le même travail. Est-ce que tu me comprends?
    Non, tu n'es pas très clair

    L'appel d'une template se fait par un apply déja et il n'y a normalement aucun raison de faire précéder par un axe fils. Si tu veux avoir toujours le même template utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <xsl:template match="convertible_bond">
    </xsl:template>
    et c'est dans l'apply-templates que tu définiras quelles balises tu parseras

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Par défaut
    En fait mon code est faux c'est le suivant que je voudrais essayer de réaliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xsl:choose> 
    <xsl:when test="name(ihg/derivatives/*[1])"='cb_option'> 
    <xsl:template match="ihg/derivatives/*[1]/convertible_bond">
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:template match="ihg/derivatives/*[1]"> 
    </xsl:otherwise> 
    </xsl:choose>
    Mais Erwy dans ce que tu dis, est-ce que je peux choisir sur quel template je peux faire "apply-templates"?

  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
    Par défaut
    tu n'as pas besoin de faire de choix si tu veux appliquer le même code dans les deux , comme tu le dis ici.

    "convertible_bond" une seul fois. Je ne sais pas si je suis très clair. Si je fais ce que tu me dis, sachant que les règles associées à un template s'applique entre la définition du template et la fin de celui-ci, je devrais faire deux fois le même travail
    Au vu de ce que tu demande le bon code serait tout simplement quelque chose 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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="text"/>
    	<xsl:template .......>
    	<xsl:apply-templates select="ihg/derivatives//convertible_bond"></xsl:apply-templates>
    	</xsl:template>
     
    <xsl:template match="convertible_bond">
    .......
    </xsl:template>
     
    </xsl:stylesheet>
    ici l'apply va selectionner tous les descendants (fils ,petit-fils....) convertible_bond de ihg/derivatives

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Par défaut
    Erwy j'ai essayé mais ça ne fait pas ce que je veux.
    Bon, je vais essayer d'être plus clair.
    Ce que je voudrais c'est que independemment du fichier xml, le bout de code suivant marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <table border="1" cellspacing="0" cellpadding="5" width="50%">
    <tr bgcolor="#DDDDDD">
    <td>
    <xsl:value-of select="issue_date"/>
    </td>
    </tr>
    </table>
    que "issue_date" soit un fils de "ihg/derivatives/convertible_bond/bond_terms"
    ou de "ihg/derivatives/cb_option/convertible_bond/bond_terms" sans dupliquer le code bien sûr. C'est-à-dire traiter les deux cas avec un template "générique" si je peux dire.

  10. #10
    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
    Par défaut
    Tu n'as pas du essayer très fort (ou alors tes exemples ou ta demande sont d'un manque de clarté qui confine à l'obscurité) parce que le code

    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="text"/>
    	<xsl:template  match="/">
    	<xsl:apply-templates select="ihg/derivatives//convertible_bond"></xsl:apply-templates>
    	</xsl:template>
     
    <xsl:template match="convertible_bond">
     
    <table border="1" cellspacing="0" cellpadding="5" width="50%">
    <tr bgcolor="#DDDDDD">
    <td>
    <xsl:value-of select="bond_terms/issue_date"/>
    </td>
    </tr>
    </table> 
     
    </xsl:template>
     
    </xsl:stylesheet>
    me renvoit exactement le même type de résultat pour tes deux xml

  11. #11
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Par défaut
    ok ca a l'air de marcher.
    merci bcp Erwy.
    désolé pour l'édition du code.

  12. #12
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 6
    Par défaut
    J'ai une autre petite question
    Si maintenant j'ai les fichiers xml précédent et un troisième fichier xml identique au second mais dans lequel "convertible_bond" serait remplacé par "bond".
    Est-il possible dans ce cas d'utiliser les templates comme tu l'a fait pour que je puisse choisir indépendemment "bond", "convertible_bond" ou tout autre chose
    qui serait au même niveau de mon arborescence?

Discussions similaires

  1. [XSLT] Problème avec apply-templates
    Par NeoMan dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 29/12/2005, 14h45
  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. [xslt][Javascript] Problème de templates
    Par Dnallabar dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 03/11/2005, 11h55
  4. [XSLT]select sur plusieur documents XML
    Par jesus144 dans le forum XMLRAD
    Réponses: 3
    Dernier message: 15/06/2005, 10h56
  5. [XSLT] Différence entre apply-templates et call-template
    Par Cpt.FLAM dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 04/04/2005, 18h47

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