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 :

Mettre le résultat de l'appel d'une fonction dans une variable


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut Mettre le résultat de l'appel d'une fonction dans une variable
    Bonjour,

    Dans une opération de transformation, j'ai besoin d'effectuer un traitement spécifique suivant la cardinalité d'un ComplexType.

    Pour le faire, j'ai commencé à écrire une fonction qui, étant donné le nom du type complexe en question pourra déterminer la cardinalité de celui-ci (minOccurs, maxOccurs).

    Je souhaiterai pouvoir appeler la fonction mais ne rien afficher et sauvegarder le résultat dans une variable puis faire un xsl:choose dessus depuis le bloc de transformation appelant... Les tutos que j'ai pu lire dont celui-ci n'indique pas comment faire cela.

    Pourriez-vous me dépanner svp ?

    Merci

  2. #2
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Il vaut mieux commencer par le plus débouillé: supposons on est là où le noeud de contexte est doué d'avoir des facet minOccurs et maxOccurs, alors la valeur par défaut est plus probable que non 1. Le variable pour chacun peut s'écrire comme ça.
    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
     
    <xsl:variable name="m">
      <xsl:choose>
        <xsl:when test="@minOccurs">
          <xsl:value-of select="@minOccurs" />
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="'1'" />
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:variable name="M">
      <xsl:choose>
        <xsl:when test="@maxOccurs">
          <xsl:value-of select="@maxOccurs" />
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="'1'" />
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>

  3. #3
    Expert confirmé
    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
    Points : 4 847
    Points
    4 847
    Par défaut
    Simplement comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:variable name="resultat">
      <xsl:call-template name="ta_fonction"/>
    </xsl:variable>

  4. #4
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Merci pour vos réponses

    Cependant, je bloque sur un élément probablement lié au contexte.

    Mon document a la structure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <ROOT>
       <xs:listOfComplexType>
           <!-- Liste des complex Type avec des définitions de MinOccurs et MaxOccurs-->
           <xs:element name="NomDuComplexType" minOccurs="x">
            ....
       </xs:listOfComplexType>
        <xs:complexType name="NomDuComplexType">
        </xs:complexType>
    </ROOT>
    Je fais un xsl:template match pour récupérer des noeuds qui respectent une certaine condition.

    Une fois dans le noeud que je cherche (qui est forcément un noeud enfant de xs:complexType, je souhaite pouvoir faire une recherche à partir du ROOT pour lire la valeur du minOccurs.

    C'est pour cela que j'avais besoin d'une fonction.

    Cependant, en faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	<xsl:variable name="parentComplexTypeMinOccurs">
     
    		<xsl:value-of select="ancestor::*/xs:listOfComplexType/xs:element/@minOccurs" />
     
     
    	</xsl:variable>
    Je n'ai pas le résultat escompté. Après quelques tests, j'ai le sentiment que l'ancestor s'arrête au parent de mon noeud (qui est un complexType) et ne remonte pas à la racine.

    Je ne sais pas si j'ai pu clairement expliquer la problématique

  5. #5
    Expert confirmé
    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
    Points : 4 847
    Points
    4 847
    Par défaut
    Euh... là le contenu de ta variable sera la valeur de l'attribut minOccurs, pas un élément.

  6. #6
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    [0] Je n'attendrais pas ça: xs:listOfComplexType est preque certainement faux quelque soit la signification ou definition du prefix xs et si xs:element est ce qu'on entend de w3c schema. Il faut listOfComplexType être defini dans un autre espace de nom. Heureusement, ce n'est pas le sujet.

    [1] Si Root est connu en général, il suffit de faire un xpath absolu, non?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:variable name="parentComplexTypeMinOccurs">
        <xsl:value-of select="/ROOT/xs:listOfComplexType[1]/xs:element[1]/@minOccurs" />
    </xsl:variable>
    Comme le nom listOfComplexType suggère qu'il se puisse d'avoir plusieurs éléments, un index est presque toujours besoin pour bien le localiser ou bien des prédicats appropriés.

    [1.1] Si Root n'est pas connu a priori et un axis ancestor est préféré pour garder la flexibilité, un example peut vous aider.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <xsl:variable name="p">
        <xsl:value-of select="count(ancestor::*)" />
    </xsl:variable>
    <xsl:variable name="parentComplexTypeMinOccurs">
        <xsl:value-of select="ancestor::*[$p]/xs:listOfComplexType[1]/xs:element[1]/@minOccurs" />
    </xsl:variable>

  7. #7
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    [1.2] Encore un alternatif, c'est plus simple si on veut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xsl:variable name="parentComplexTypeMinOccurs">
        <xsl:value-of select="ancestor::*[last()]/xs:listOfComplexType[1]/xs:element[1]/@minOccurs" />
    </xsl:variable>

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. Réponses: 8
    Dernier message: 05/07/2011, 11h51
  3. Réponses: 4
    Dernier message: 04/06/2010, 14h48
  4. Appel d'une fonction dans une fonction (sql server 2005)
    Par catchouse dans le forum Développement
    Réponses: 10
    Dernier message: 06/05/2009, 12h03
  5. Appeler une fonction dans une fonction
    Par bryanstaubin dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 18/06/2007, 09h39

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