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 :

Un petit probleme en XSL


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Un petit probleme en XSL
    Est-ce qu'un pro de XSL pourrait me dire comment remplacer l'utilisation des variables
    cli1, cli2...clin (;-) clin d'oeil!!) par une structure de donnée plus sympa
    dans le code suivant...
    sachant que les données de type array n'existe pas.
    (Ah, ce manque de tableau. j'ai encore du mal a m'y habitué!!)

    Merci
    -___________________________________
    Lit les elts d'une liste dans un fichier

    <xsl:variable name="Assoc" select="document($NomDoc)//Cli "/>
    <xsl:variable name="cli1" select="$Assoc[position()=1]/@name"/>
    <xsl:variable name="cli2" select="$Assoc[position()=2]/@name"/>
    <xsl:variable name="cli3" select="$Assoc[position()=3]/@name"/>

    A chacun de ces elts est associé une valeur par default
    <xsl:variable name="Default1">
    <xsl:call-template name="setDefaut">
    <xsl:with-param name="cli" select="$cli1"/>
    </xsl:call-template>
    </xsl:variable>
    ....

    pour chacun de ces elements une cle est défini sur une liste
    <xsl:key name="Kcli1" match="//*[local-name()='ListeNom'][contains($cli1,@cli)]/Nom" use="@name"/>
    <xsl:key name="Kcli2" match="//*[local-name()='ListeNom'][contains($cli2,@cli)]/Nom" use="@name"/>
    <xsl:key name="Kcli3" match="//*[local-name()='ListeNom'][contains($cli3,@cli)]/Nom" use="@name"/>

    dans un autre fichier
    on lit les enr un à un
    quand "$v_nom" est lu, l'index correspondant est parcouru à la recherche de la valeur
    pour afficher une valeur associée ($NomAssoc)


    <xsl:choose>
    <xsl:when test="$Cli=$cli1" >
    <xsl:for-each select="document($NomDoc)">
    <xsl:value-of select="key('Kcli1',$V_nom)/@NomAssoc"/>
    </xsl:for-each>
    </xsl:when>
    .....
    <xsl:choose>

  2. #2
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Re: Un petit probleme en XSL
    Citation Envoyé par cchatel2000
    Est-ce qu'un pro de XSL pourrait me dire comment remplacer l'utilisation des variables
    cli1, cli2...clin (;-) clin d'oeil!!) par une structure de donnée plus sympa
    dans le code suivant...
    sachant que les données de type array n'existe pas.
    (Ah, ce manque de tableau. j'ai encore du mal a m'y habitué!!)

    Merci
    Apparemment, l'absence du type array n'évoque de réaction chez personne...
    Y aurait-il des astuces?
    Comment peut-on remplacer ce type de structure?

    Dans le problème ci-dessus j'aimerai définir une structure de donnée dynamique dépendant d'une liste lu dans un fichier en entrée or tel que cela est fait je dois définir au préalable à lecture de mon fichier un nombre arbitraire de variables dans l'espoir que mon fichier en entrée n'en contienne pas plus....La structure est aussi trés lourde car si j'attends 10 valeurs, je dois dupliquer toutes mes lignes de codes 10 fois ...je vous laisse rêver au cas où j'en attendrais 100.


    Personne n'a d'idée??

    Je me serai trompé de forum alors!

  3. #3
    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,

    le principal piège à éviter avec XSLT est de vouloir lui appliquer les techniques utilisées avec les langages "traditionnels"... Il n'y a avec XSLT 1.0 que 5 types de variables :
    - Les node-sets (ensembles ordonnés de noeuds)
    - Les nombres (à virgule flottantes)
    - Les chaînes
    - Les booléens
    - Les Result Tree Fragments (RTF - fragment d'arbre stocké dans une variable, d'utilisation très limitée)

    Il va falloir que tu te débrouilles avec cela...
    Le plus souvent, on "émule" un tableau en utilisant une variable de type node-set et en écrivant une fonction récursive pour la parcourir. Mais dans ton cas, ce n'est pas forcément le plus opportun, il faudrait avoir un peu plus de renseignements sur ta structure XML pour en être sûr...

  4. #4
    Futur Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    ...La suite....
    Effectivement je n'ai pas décrit le contexte mais ça va venir ....

    Je n'ai pas eu le temps depuis, peut-être que la solution (même certainement ) ci-dessus n'est pas la bonne... J'ai tout à coup un doute

    Le premier fichier est un fichier contenant deux listes dont voici la structure:

    <Liste>
    <!-- une première liste de type de clients par exemple -->
    <ListeCli Ident="Liste1" >
    <cli name="un"/>
    <cli name="deux"/>
    .....
    </ListeCli>
    ...
    <!-- chacun de ces clients possede des attributs "nom1, etc...." auxquels on associe des noms "assoc1, assoc2, etc...." -->
    <ListeNom Cli="un">
    <Nom name="nom1" NomAssocie="assoc1" />
    <Nom name="nom2" NomAssocie="assoc2" />
    .....
    <Nom name="default" NomAssocie="xxx" />
    </ListeNom>
    </Liste>
    <!-- On a défini aussi une valeur par "défault" qui ne parait pas très judicieuse puisqu'il aurait peut-être mieux valu ajouter un attribut (au sens Xsl) default à l'élément ListeNom -->


    Le second fichier est parsé en ayant memorisé la structure ci-dessus:
    <LListe>
    <Client>
    <AttributTypeCli name="Cli1" />
    <AttributNom name="nom1"/>
    </Client>
    .....
    </LListe>

    et on affiche pour chacun des clients le nom associé à "nom1" par exemple défini pour son type (ici CLi1) s'il existe ou le nom par default.

    Cela parait peut-être pas clair mais l'intêret est que ça fait référence à deux indirections ou deux boucles: une sur les type de clients et l'autre sur les attributs des clients....
    Je suis preneur pour toute solution ou idée de solution plus simple.

Discussions similaires

  1. Petit problème de fork
    Par osmose22 dans le forum Linux
    Réponses: 7
    Dernier message: 18/03/2007, 21h10
  2. [TP]petit probleme avec solution
    Par pompompolom dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 02/12/2004, 19h48
  3. petit probleme avec l'éditeur de builder
    Par qZheneton dans le forum C++Builder
    Réponses: 2
    Dernier message: 28/10/2004, 16h19
  4. petit probleme de requete
    Par nico33307 dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 25/08/2004, 11h36
  5. petit probleme dans une requte POSTGRE SQL
    Par ghis le fou dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/09/2003, 13h51

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