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 :

se passer d'une variable? problème de contexte? [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 à l'essai
    Inscrit en
    Février 2011
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 5
    Par défaut se passer d'une variable? problème de contexte?
    bonjour voici mon xslt:

    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:template match="dataStore">
    <xsl:for-each select="activites/item/partenairesTEST/item">
    <xsl:variable name="v" select="count(preceding-sibling::item)+1"/>
    <xsl:value-of select="$v"/>	
    <xsl:value-of select="../../../../partenaires/item[position()=$v]/nom"/>
    <xsl:value-of select="../../../../partenaires/item[position()=count(preceding-sibling::item)+1]/nom"/>
    <xsl:element name="br"/> 
    </xsl:for-each>	
    </xsl:template>
    </xsl:stylesheet>
    appliqué sur le fichier xml, cela donne ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    1p1p1
    2p2p1
    3p3p1
    1p1p1
    2p2p1
    3p3p1
    1p1p1
    2p2p1
    3p3p1
    quand j'utilise la variable $v définie, cela me renvoie le bon résultat;
    quand j'utilise la définition de la variable, cela ne me renvoie pas le bon résultat (et cela me renvoie d'office p1) car le count renvoie 0 (et non pas 0, 1 puis 2)

    le souci est que dois utiliser dans l'ETL Talend la requête XPath, sans variable (je n'ai pas trouvé dans le composant tFileInputMSXML comment en utiliser une)

    merci

  2. #2
    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
    quand j'utilise la variable $v définie, cela me renvoie le bon résultat;
    quand j'utilise la définition de la variable, cela ne me renvoie pas le bon résultat (et cela me renvoie d'office p1) car le count renvoie 0 (et non pas 0, 1 puis 2)
    Normal est défini dans un noeud et ton deuxième XPath en est un autre...


    Met un xml exemple et décris un peu les relations entre les balises.

    Si je ne me trompe pas c'est assez faisable, mais, toujours si je ne me trompe pas, ton XSLT est une usine à gaz dont il ne faut surtout pas s'inspirer

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2011
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 5
    Par défaut
    j'ai résolu le problème comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="../../../../partenaires/item[position()=count(current()/preceding-sibling::item)+1]/nom"/>
    par contre, dans l'ETL Talend, il ne reconnait pas la fonction current() dans une requête Xpath !!! (et cela donne le même bug qu'avec XSLT même si j'utilise le "." comme ceci dans Talend:

    "../../../../partenaires/item[position()=count(./preceding-sibling::item)+1]/nom"

    mon xml ressemble à ceci:

    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
    <partenaires>
    <item>
    <nom class="String">p1</nom> 
    </item>
    <item>
    <nom class="String">p2</nom> 
    </item>
    <item>
    <nom class="String">p3</nom> 
    </item>
    </partenaires>
     
    <acitivites>
    <item>
    <partenairesTEST>
    <item>
    <typeApport>
    <ouiNon class="String">Non</ouiNon> 
    </typeApport>
    </item>
    <item>
    <typeApport>
    <ouiNon class="String">Oui</ouiNon> 
    </typeApport>
    </item>
    <item>
    <typeApport>
    <ouiNon class="String">Non</ouiNon> 
    </typeApport>
    </item>
    </partenairesTEST>
    </item>
    </acitivites>
    pour chaque activité, et chacun des partenairesTEST, on définit la valeur d'un flag "ouiNon" pour le partenaire correspondant sous le noeud partenaires

    je précise que je ne suis pas maître de la façon dont le XML est structuré

    Citation Envoyé par Erwy Voir le message
    Normal est défini dans un noeud et ton deuxième XPath en est un autre...


    Met un xml exemple et décris un peu les relations entre les balises.

    Si je ne me trompe pas c'est assez faisable, mais, toujours si je ne me trompe pas, ton XSLT est une usine à gaz dont il ne faut surtout pas s'inspirer

  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 spw71 Voir le message
    j'ai résolu le problème comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="../../../../partenaires/item[position()=count(current()/preceding-sibling::item)+1]/nom"/>
    Current() est une fonction XSLT pas XPath donc talent ne risque pas de la connaitre, elle permet de récuperer le noeud courant dur for-each dans ton cas

  5. #5
    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
    Déjà dans ton xslt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variable name="v" select="count(preceding-sibling::item)+1"/>
    c'est l'équivalent de la fonction position
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variable name="v" select="position()"/>
    Que doit ramener ton XPath et quels en sont les paramètres, vu que là tu parses tout le fichier

  6. #6
    Membre à l'essai
    Inscrit en
    Février 2011
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 5
    Par défaut
    Citation Envoyé par Erwy Voir le message
    Déjà dans ton xslt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variable name="v" select="count(preceding-sibling::item)+1"/>
    c'est l'équivalent de la fonction position
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:variable name="v" select="position()"/>
    Que doit ramener ton XPath et quels en sont les paramètres, vu que là tu parses tout le fichier
    dans Talend, tu spécifies une "Requête XPath boucle":

    "dataStore/activites/item/partenairesTEST/item"

    ensuite, pour chacun des champs que tu veux extraire, tu définis une "requête XPath"

    et c'est là que ça coince si j'utilise la fonction current()

    et avec "." ou juste comme ceci, le count renvoie 0:

    "../../../../partenaires/item[position()=count(preceding-sibling::item)+1]/nom"

    comme tu peux le voir, il faut donc utiliser le numéro d'item du champs "partenairesTEST/item" que je suis en train de lire, et prendre l'élément "partenaires/item" ayant le même numéro d'ordre

  7. #7
    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 Erwy Voir le message
    Que doit ramener ton XPath et quels en sont les paramètres, vu que là tu parses tout le fichier
    Vraisemblablement le partenaires/item qui se trouve à la même position que le partenairesTEST/item sélectionné.

    Et cela n'est pas exprimable en XPath seul, non.
    Mais je suis sûr que Talend propose quelque chose pour ces cas-là. Des variables définissables ou définies, une fonction équivalente à current(), un moteur de XQuery au lieu du simple XPath, ou alors tout simplement un langage de script impératif permettant de programmer l'algorithme qu'on veut à partir d'une vue DOM.
    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. Comment modifier une variable globale de contexte ?
    Par delilou dans le forum Développement de jobs
    Réponses: 9
    Dernier message: 03/05/2016, 15h15
  2. Récupérer une variable dans un context
    Par yoann34 dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 27/03/2013, 14h37
  3. Réponses: 10
    Dernier message: 28/05/2009, 09h29
  4. Problême pour passer une variable dans un SelectCommand
    Par Thetonio007 dans le forum ASP.NET
    Réponses: 12
    Dernier message: 26/06/2007, 14h37
  5. Réponses: 4
    Dernier message: 10/01/2006, 14h53

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