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

  1. #1
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    octobre 2006
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : octobre 2006
    Messages : 6 152
    Points : 11 409
    Points
    11 409

    Par défaut [débutant] sous-requête en XPath ?

    Bonjour,
    Je fais mes premières manipulations de requêtes XPath, et j'ai fini par trouver la syntaxe qui me ramène les éléments que je souhaite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //descendant::UDA[.="CNHO"]
    Maintenant je voudrais extraire tous les ancêtres de ces éléments... si on était en SQL, je dirais qu'il faut une sous-requête, mais en XPath, comment est-ce que cela fonctionne ?

    Merci d'avance pour toute piste !
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    octobre 2011
    Messages
    1 336
    Détails du profil
    Informations forums :
    Inscription : octobre 2011
    Messages : 1 336
    Points : 2 357
    Points
    2 357

    Par défaut

    [0] Avant de proposer une ou des solutions, je dirais l'axe de xpath montré et utilisé merite d'être re-pensé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //descendant::UDA[.="CNHO"]
    La notion // est un raccourci de l'axe descendant-or-self::node(). En ajoutant l'axe descendant::UDA..., ça a l'air déjà répétitif... En fait, l'ensemble qui va matcher le xpath ne diffère pas de celui-ci
    Je dirais ceci est plutôt plus propre dans l'écriture et dans la conception et il ne s'agit pas de goût, sinon ça ne mérite pas de faire mentionner.

    [1] Pour trouver chaque noeud de son ancêstre, on peut faire comme ça dans le template où UDA est en contexte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:for-each select="ancestor::*">
        <!-- ici c'est un example seulement -->
        <xsl:copy>
            <xsl:copy-of select="@*" />
        </xsl:copy>
    </xsl:for-each>
    Et on voit la sortie est dans l'ordre descandant de l'indice pour chaque noeud qui est un ancêstre de UDA.

    [1.1] Si on veut absolument avoir contrôl l'ordre de l'indice des noeuds dans la chaîne d'ancêstres, en xslt 1.0, on peut y arriver par une construction d'un template nommé comme ceci, par exemple.
    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
    <xsl:template name="proc">
        <xsl:param name="node" />
        <xsl:choose>
            <xsl:when test="$node/parent::*">
                <xsl:variable name="p" select="$node/parent::*" />
                <!-- ici encore on met ce qu'on veut vraiment vouloir faire, ceci est un example -->
                <xsl:element name="{name($p)}">
                    <xsl:copy-of select="$p/@*" />
                </xsl:element>
                <xsl:call-template name="proc">
                    <xsl:with-param name="node" select="$p" />
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    Et dans le template qui matche UDA, on le fait appeler comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:call-template name="proc">
        <xsl:with-param name="node" select="." />
    </xsl:call-template>
    Voilà quelques éléments pour montrer comme faire.

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    octobre 2006
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : octobre 2006
    Messages : 6 152
    Points : 11 409
    Points
    11 409

    Par défaut

    Merci de ta réponse. Entre-temps, j'ai trouvé qu'il était plus simple de re-formuler ainsi : les descendants Member de la racine, s'ils ont eux-même un descendant UDA dont la valeur est CNHO, ce qui donne une imbrication de prédicats :

    Code XPath : Sélectionner tout - Visualiser dans une fenêtre à part
    //descendant::member[descendant::uda[.='CNHO']]
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    11 804
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 11 804
    Points : 20 023
    Points
    20 023

    Par défaut

    Oui donc ça devrait s'écrire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //member[.//uda[.='CNHO']]
    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. [Débutant] Jointure ou sous-requête ?
    Par Domi2 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 17/10/2014, 13h16
  2. Débutant: UPDATE d'une table avec sous-requête ?
    Par ctobini dans le forum Débuter
    Réponses: 2
    Dernier message: 03/10/2007, 11h45
  3. Réponses: 33
    Dernier message: 06/06/2006, 14h41
  4. [Débutant] Requête SELECT avec max et sous-requête
    Par joefou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/07/2005, 14h28
  5. Réponses: 1
    Dernier message: 06/01/2003, 07h55

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