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

XML/XSL et SOAP Discussion :

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


Sujet :

XML/XSL et SOAP

  1. #1
    Rédacteur/Modérateur

    [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
    [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
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    //UDA[.="CNHO"]

    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

    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

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

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java