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 :

Portée de variable


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2013
    Messages : 19
    Par défaut Portée de variable
    Bonjour à tous,

    Je m'en remet à vous après plusieurs heures d'arrachage de cheveux.
    Je possède un fichier XML avec plusieurs noeuds "identiques" (seule la valeur change) de ce genre:

    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
    <BOM_ONE_LEVEL>
    <FIELD name="Name" value="121327-08" />
    <FIELD name="CONFIG" value="" />
    <FIELD name="NOME_ARTI_CODE_COMPOSE" value="121327-08" />
    <FIELD name="ARTI_DESIGNATION" value="BUTEES DECOUPES" />
    <FIELD name="ARTI_ARFA_CODE" value="26" />
    <FIELD name="USER" value="BE1" />
    </BOM_ONE_LEVEL>
    ........
    <BOM_ONE_LEVEL>
    <FIELD name="Name" value="121327-08S00" />
    <FIELD name="CONFIG" value="Défaut" />
    <FIELD name="NOME_ARTI_CODE_COMPOSANT" value="121327-08S00" />
    <FIELD name="ARTI_DESIGNATION" value="BUTEESVERSION N" />
    <FIELD name="ARTI_USER_CAR1" value="" />
    <FIELD name="NOME_COEFFICIENT" value="1" />
    <FIELD name="ARTI_ARFA_CODE" value="26" />
    </BOM_ONE_LEVEL>
    .........
    .. Ce qui m'intéresse et qui se trouve 1 noeud sur 2 c'est le champ <FIELD name="USER" value="BE1" />. Je récupère donc ce champ grâce à <xsl:variable name="USER" select="*[6]/@value" /> mais je ne sais pas comment garder la variable USER = "BE1" fixe pour que je puisse ensuite construire un code du genre:

    ..
    N|113547-10|121327-10S00|ENROBEUR|||1|26|BE1|
    N|154327-10S00|104-9000-002|POULIE L2051|1|
    N|484544-10540|101-0500-001|VIS A BILLES PLAQUEUR LAT.|51|BE1|
    ..
    avec BE1 au dernier Pipe (ex ci-dessus)

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:output method="text"></xsl:output>
      <xsl:template match="/">
     <!-- on génère l'entête du fichier TXT -->
     <!--<xsl:text>TYPE|COMPOSE|N_PLAN|DESCRIPTION|REF CONST|SE     BE|QUANTITE|FAMILLE|USER|</xsl:text>-->
    <!-- on traite le premier niveau des articles de nomenclature d'assemblage -->
    <xsl:for-each select="EPDM_GATEWAY/TOTAL_BOM/BOM_ONE_LEVEL">
     
       <xsl:variable name="USER_NAME" select="*[6]/@name" />
       <xsl:variable name="USER" select="*[6]/@value" />
     
         <xsl:if test="BOM_ITEMS_LIST">
     
         <xsl:variable name="COMPOSE_NAME" select="*[3]/@value" />
         <xsl:variable name="SOUS_ENSEMBLE" select="substring-after($COMPOSE_NAME,'-')" />
     
          <xsl:for-each select="BOM_ITEMS_LIST/BOM_ITEM">
          <!-- on traite le niveau des liens de nomenclature -->
          <!-- on traite en détail chaque champs de la nomenclature --> 
          <xsl:text>N|</xsl:text>
            <xsl:value-of select="$COMPOSE_NAME" />
          <xsl:text>|</xsl:text>
            <xsl:value-of select="*[3]/@value"></xsl:value-of>
          <xsl:text>|</xsl:text>
            <xsl:value-of select="*[4]/@value" />
          <xsl:text>|</xsl:text>
            <xsl:value-of select="*[5]/@value" />
          <xsl:text>|</xsl:text>
     
         <xsl:if test="string-length($SOUS_ENSEMBLE) = 5">
          <xsl:value-of select="$SOUS_ENSEMBLE"/>
         </xsl:if>
     
          <xsl:text>|</xsl:text>
            <xsl:value-of select="*[6]/@value" />
          <xsl:text>|</xsl:text>
            <xsl:value-of select="*[7]/@value" />
          <xsl:text>|</xsl:text> 
            <xsl:value-of select="$USER" /> 
          <xsl:text>|</xsl:text>
              <xsl:text>
    </xsl:text>
            </xsl:for-each>
       </xsl:if>
        </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>
    Vous l'aurez compris, la valeur de la variable USER change 1 fois sur 2. Je souhaite garder ma variable User fixe avec BE1 à l'intérieur par exemple ( le nom de l'user est amené a changer, pas moyen de le fixer en dur ) et vu qu'il n'y a pas moyen de changer la valeur d'une variable en cours de route, je suis perdu..

    J'espère avoir été assez clair.
    Merci d'avance,

    L'homme sans plus de cheveux

  2. #2
    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
    Citation Envoyé par Tony-ESAIP Voir le message
    J'espère avoir été assez clair.
    Au début ça allait mais tu m'as perdu sur la fin...

    Quoi qu'il en soit tu t'y prends très mal pour récupérer tes valeurs.
    Plutôt que de te baser sur la position relative de tes champs (FIELD) les uns par rapport aux autres, il serait nettement préférable (absolument indispensable en fait) que tu te bases sur le nom du champ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <!-- ... -->
       <xsl:variable name="USER" select="FIELD[@name='USER']/@value" />
     
         <xsl:if test="BOM_ITEMS_LIST">
     
         <xsl:variable name="COMPOSE_NAME" select="FIELD[@name='NOME_ARTI_CODE_COMPOSANT']/@value" />
         <xsl:variable name="SOUS_ENSEMBLE" select="substring-after($COMPOSE_NAME,'-')" />
    <!-- ... -->

  3. #3
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2013
    Messages : 19
    Par défaut
    Merci, ça m'aide énormément !

    J'ai encore un petit problème, vu que ma variable USER est utilisé 1 noeuds sur 2 et que le résultat actuel est:

    N|113547-10|121327-10S00|ENROBEUR|||1|26|BE1|
    N|154327-10S00|104-9000-002|POULIE L2051|1|
    N|484544-10540|101-0500-001|VIS A BILLES PLAQUEUR LAT.|51|BE1|
    N|152355-10S00|104-5410-002|BRAS PLDE|1|


    .. J'aimerais pouvoir affecter sur chaque ligne la variable BE1 à la place du "1" qui se trouve 1 ligne sur 2. Je ne sais pas encore comment m'y prendre au niveau de ma boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
              <xsl:text>|</xsl:text>
              <xsl:value-of select="FIELD[@name='NOME_COEFFICIENT']/@value"/>
              <xsl:text>|</xsl:text>
        <xsl:value-of select="FIELD[@name='ARTI_ARFA_CODE']/@value"/>
              <xsl:text>|</xsl:text>  
     
    <--- Probablement à ce niveau là --->
        <xsl:value-of select="$USER" />   
              <xsl:text>|</xsl:text>
              <xsl:text>
    </xsl:text>
        </xsl:for-each>

  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
    Si tu récupères "1" au même endroit que "BE1", c'est que tu as dû continuer d'utiliser la position.
    Fais voir ton fichier XSL en entier...

  5. #5
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2013
    Messages : 19
    Par défaut
    Oui c'est absolulement ç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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:output method="text"></xsl:output>
      <xsl:template match="/">
        <!-- on génère l'entête du fichier TXT -->
        <!--<xsl:text>TYPE|COMPOSE|N_PLAN|DESCRIPTION|REF CONST|SE BE|QUANTITE|FAMILLE|USER|</xsl:text>-->
        <!-- on traite le premier niveau des articles de nomenclature d'assemblage  -->
              <xsl:for-each select="EPDM_GATEWAY/TOTAL_BOM/BOM_ONE_LEVEL">
     
    		  <xsl:variable name="USER" select="FIELD[@name='USER']/@value" />
     
              <xsl:if test="BOM_ITEMS_LIST">
     
              <xsl:variable name="COMPOSE_NAME" select="FIELD[@name='NOME_ARTI_CODE_COMPOSANT']/@value" />
              <xsl:variable name="SOUS_ENSEMBLE" select="substring-after($COMPOSE_NAME,'-')" />
     
              <xsl:for-each select="BOM_ITEMS_LIST/BOM_ITEM">
              <!-- on traite le niveau des liens de nomenclature  -->
              <!-- on traite en détail chaque champs de la nomenclature -->      
              <xsl:text>N|</xsl:text>
              <xsl:value-of select="$COMPOSE_NAME" />
              <xsl:text>|</xsl:text>
              <xsl:value-of select="FIELD[@name='NOME_ARTI_CODE_COMPOSANT']/@value"/>
              <xsl:text>|</xsl:text>
              <xsl:value-of select="FIELD[@name='ARTI_DESIGNATION']/@value"/>
              <xsl:text>|</xsl:text>
              <xsl:value-of select="FIELD[@name='ARTI_USER_CAR1']/@value"/>
              <xsl:text>|</xsl:text>
               <xsl:if test="string-length($SOUS_ENSEMBLE) = 5">
                <xsl:value-of select="$SOUS_ENSEMBLE"/>
               </xsl:if>	   
              <xsl:text>|</xsl:text>
              <xsl:value-of select="FIELD[@name='NOME_COEFFICIENT']/@value"/>
              <xsl:text>|</xsl:text>
    		  <xsl:value-of select="FIELD[@name='ARTI_ARFA_CODE']/@value"/>
              <xsl:text>|</xsl:text> 
    		 <xsl:value-of select="$USER" />		
              <xsl:text>|</xsl:text>
              <xsl:text>
    </xsl:text>
    	</xsl:for-each>		  
    	</xsl:if>
        </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>

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

Discussions similaires

  1. [FLASH MX] Portée des variables ???
    Par mic79 dans le forum Flash
    Réponses: 2
    Dernier message: 08/02/2005, 10h21
  2. Portée des variables vbscript vers ASP
    Par Immobilis dans le forum ASP
    Réponses: 3
    Dernier message: 03/11/2004, 10h14
  3. [XSL]Problème de portée des variables
    Par djulesp dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 17/09/2004, 10h34
  4. [Portée] portée des variables
    Par parksto dans le forum Langage
    Réponses: 7
    Dernier message: 09/05/2004, 21h05
  5. [FLASH MX 2004][XML]portée de variable
    Par marco_ dans le forum Flash
    Réponses: 8
    Dernier message: 29/04/2004, 15h47

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