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 :

Tester l'appartenance à un ensemble [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 éclairé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 71
    Par défaut Tester l'appartenance à un ensemble
    J'ai un ensemble d'entiers [1,2,3]

    Je souhaite le lettre dans une variable

    machingIds=[1,2,3]

    puis récupérer tous les noeuds dont l'@id appartient à cet ensemble.

    J'ai regardé du coté de la fonction fn:index-of mais je ne parviens pas à trouver la syntaxe correcte.

    fn:index-of ((15, 40, 25, 40, 10), 40)
    me renvoie une erreur disant qu'une parenthèse est rencontrée alors qu'une virgule est attendue.

    Quelqu'un a une idée?

    Merci d'avance

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Août 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 16
    Par défaut
    Bonjour,

    Un exemple serait plus facile pour t'aider :s

    Si tu veux simplement récupérer les noeuds avec un id à 1, 2 et 3 alors un copy-of sur les noeuds avec un prédicat "//noeud[@id=$var]" devrait être suffisant.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 71
    Par défaut
    Disons que j'ai des balises

    <noeud id="1" value="14">
    <noeud id="2" value="6">
    <noeud id="3" value="8">
    <noeud id="4" value="5">
    Je veux pouvoir récupérer en une seule ligne la somme des valeurs des noeuds appartenant à un groupe (qui n'est pas connu en dehors du XSL, donc je ne peux pas ajouter un attribut "group" dans le XML)

    Disons le groupe {1,2,4}

    Je veux récupérer la somme des valeurs des noeuds dont l'id appartient à ce groupe sans avoir à faire

    <xsl:value-of select="noeud[@id=1]/@value + noeud[@id=2]/@value + noeud[@id=4]/@value"/>
    je voudrais plutôt quelque chose du style

    <xsl:variable name="group" select="{1,2,4}">
    <xsl:value-of select="sum(noeud[@id in $group]/@value)"/>
    Cela me permettrait de paramétrer des groupes tout en haut du fichier XSL et de les réutiliser plus bas.

    Est-ce plus explicite?

  4. #4
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    Le mieux serait que tu nous montres ton code actuel réel afin qu'on voit s'il y'a des erreurs de syntaxes, parce que le problème vient probablement de là.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Août 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 16
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xsl:variable name="group" select="1,2"></xsl:variable>
    <xsl:value-of select="sum(//noeud[@id = $group]/@value)"/>
    Pour moi, cela fonctionne, reste encore à voir comment tu déclares les valeurs de ta variable ..

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 71
    Par défaut
    @Zeh0pe

    C'est exactement à ça que je veux parvenir mais je ne trouvais pas de syntaxe pour définir mes groupes, alors je cherchais du cotés des fonctions.

    A ce que tu me dis, j'ai bien l'impression que ton code fonctionne chez toi. Toutefois, l'interpréteur n'a pas l'air de vouloir le prendre chez moi :

    javax.xml.transform.TransformerException: Jetons incorrects supplémentaires : ',', '2'
    Est-ce une construction qui n'est autorisée qu'à partir d'une certaine version de la norme XSL ?

    Si ça peut aider, voici le contenu du MANIFEST.MF du fop.jar que j'utilise pour la transformation XSLT

    Name: org/apache/fop/
    Specification-Title: XSL-FO - Extensible Stylesheet Language
    Specification-Version: 1.0
    Specification-Vendor: World Wide Web Consortium
    Specification-URL: http://www.w3.org/TR/xsl
    Implementation-Title: Apache FOP
    Implementation-Version: 0.95
    Implementation-Vendor: The Apache Software Foundation (http://xmlgraph
    ics.apache.org/fop/)

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Août 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 16
    Par défaut
    Effectivement en version XSL 1, ce n'est pas possible, seulement en version 2.

    Il y a bien entendu une "bidouille" mais pas très propre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:variable name="group">
         <valeur>1</valeur>
         <valeur>2</valeur>
         <valeur>4</valeur>
    </xsl:variable>
    <xsl:value-of select="sum(//noeud[@id = $group//valeur]/@value)"/>
    Sinon utiliser FOP 1.0

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 71
    Par défaut
    ça marche

    A un détail près:
    On ne peut pas utiliser directement le groupe créé dans l'expression, il faut d'abord créer une variable intermédiaire pour le caster en node set, sous peine de se prendre cette exception

    org.apache.xpath.objects.XRTreeFrag cannot be cast to org.apache.xpath.objects.XNodeSet
    Voici le bout de code qui a fonctionné chez moi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <xsl:variable name="group">
        <valeur>1</valeur>
        <valeur>2</valeur>
        <valeur>4</valeur>
    </xsl:variable>
     	
    <xsl:variable name="group-ns" select="exsl:node-set($group)" xmlns:exsl="http://exslt.org/common"/>
    
    <xsl:value-of select="sum(//noeud[@id = $group-ns//valeur]/@value)"/>

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/03/2010, 09h03
  2. [LDAP] Tester l'appartenance à un groupe
    Par juninho269 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 25/03/2008, 02h33
  3. Réponses: 1
    Dernier message: 21/04/2007, 09h34
  4. Tester l'appartenance à un ensemble
    Par Tchaill39 dans le forum Delphi
    Réponses: 1
    Dernier message: 11/04/2007, 08h45
  5. Réponses: 2
    Dernier message: 03/04/2007, 10h46

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