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 :

Utilisation d'une variable liste


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 78
    Points : 62
    Points
    62
    Par défaut Utilisation d'une variable liste
    Bonjour,

    Je cherche à utiliser une variable pour paramétrer les actions qui doivent être exécutées par mon script XSLT. J'ai donc écrit le code ci-dessous.

    Voici comment il doit se comporter sur cet exemple de variable : la variables 'modifications' indique que dans les éléments 'property' ayant pour attribut 'name' le mot 'Language' il faut ajouter l'attribut node="@Language".

    Je boucle donc sur les éléments de ma variables, par contre dans mon template nommé "modif" je veux pouvoir de nouveau accéder aux éléments du ducument XML, en fait tout ça est un peu flou et je pense que le code ci-dessous va vous faire rebondir sur vos chaises, je prends donc tout conseil...
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
     
    	<xsl:variable name="modifications">
    		<adds>
    			<attribute property="Languague" newAttrName="node" newAttrValue="@Language"/>
    		</adds>
    	</xsl:variable>	
     
    	<xsl:template match="/">
    		<xsl:for-each select="$modifications/adds">
    			<xsl:call-template name="modif">
    				<xsl:with-param name="property"><xsl:value-of select="@property"/></xsl:with-param>
    				<xsl:with-param name="newAttrName"><xsl:value-of select="@newAttrName"/></xsl:with-param>
    				<xsl:with-param name="newAttrValue"><xsl:value-of select="@newAttrValue"/></xsl:with-param>
    			</xsl:call-template>
    		</xsl:for-each>
    	</xsl:template>
     
    	<xsl:template name="modif">
    		<xsl:param name="property"/>
    		<xsl:param name="newAttrName"/>
    		<xsl:param name="newAttrValue"/>
    		???
    	</xsl:template>	
     
    </xsl:stylesheet>

  2. #2
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 50
    Points : 56
    Points
    56
    Par défaut
    j'avoue ne pas avoir tout compris

    ce ne serait pas un truc comme ça que tu souhaites faire

    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
     
    <xsl:variable name="langue">UK</xsl:variable>
     
    <xsl:template match="/">
    	<xsl:apply-templates/>
    </xsl:template>
     
     
    <xsl:template match="adds">
    	<adds>
    		<xsl:if test="@property = 'Language'">
    			<xsl:attribute name="Language"><xsl:value-of select="$langue"/></xsl:attribute>
    		</xsl:if>
    		<xsl:apply-templates/>
    	</adds>
    </xsl:template>
    si tu peux écrire le XML d'entrée que tu as et celui que tu souhaites en sortie, ce sera plus clair pour moi

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 78
    Points : 62
    Points
    62
    Par défaut
    Entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <hibernate-mapping package="com.orange.tvod.agregator.storage">
    	<class
    		name="Asset"
    		table="ASSET"
    		node="Asset"
    	>
    		<meta attribute="sync-DAO">true</meta>
    		<property
    			name="Languague"
    			column="LANGUAGUE"
    			type="string"
    			not-null="false"
    			length="100"
    		/>
    Sortie :
    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
    <hibernate-mapping package="com.orange.tvod.agregator.storage">
    	<class
    		name="Asset"
    		table="ASSET"
    		node="Asset"
    	>
    		<meta attribute="sync-DAO">true</meta>
    		<property
    			name="Languague"
    			column="LANGUAGUE"
    			type="string"
    			not-null="false"
    			length="100"
                            node="@Language"
    		/>
    La différence étant le node="@Language" ajouté dans <property/>, le but étant de pouvoir définir dans un fichier à part (donc ma variable liste pour pouvoir y insérer un nombre indéfini d'actions) les actions d'ajouts à effectuer dans le XML original.

    Les champs de mes actions sont donc :
    - Le nom de l'élement à considérer (ici 'property')
    - Le nom de l'attribut à ajouter (ici 'node')
    - La valeur de l'attribut ajouté (ici '@Language')


    Mon code actuel est celui-ci, mais il me génère des erreurs et je ne suis pas sûr de ce que je suis entrain d'écrire :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    	<xsl:variable name="modifications">
    		<adds>
    			<attribute property="Languague" newAttrName="node" newAttrValue="@Language"/>
    		</adds>
    	</xsl:variable>	
    	<xsl:template match="/">
    		<xsl:for-each select="$modifications/adds/attribute">
    			<xsl:for-each select="/hibernate-mapping/class/property[@name = '@$property']">
    				<xsl:call-template name="modif">
    					<xsl:with-param name="property"><xsl:value-of select="$modifications/@property"/></xsl:with-param>
    					<xsl:with-param name="newAttrName"><xsl:value-of select="$modifications/@newAttrName"/></xsl:with-param>
    					<xsl:with-param name="newAttrValue"><xsl:value-of select="$modifications/@newAttrValue"/></xsl:with-param>
    				</xsl:call-template>
    			</xsl:for-each>
    		</xsl:for-each>
    	</xsl:template>
    	<xsl:template name="modif">
    		<xsl:param name="property"/>
    		<xsl:param name="newAttrName"/>
    		<xsl:param name="newAttrValue"/>
    		<xsl:attribute name="$newAttrName">
    			<xsl:value-of select="$newAttrValue"/>
    		</xsl:attribute>
    	</xsl:template>	
    </xsl:stylesheet>

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 466
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 466
    Points : 1 610
    Points
    1 610
    Par défaut
    Je ferais plutôt 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    	xmlns:msxml="urn:schemas-microsoft-com:xslt"
                    extension-element-prefixes="msxml">
       <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
     
       <xsl:variable name="modifications">
          <adds>
             <attribute property="Languague" newAttrName="node" newAttrValue="@Language" />
          </adds>
       </xsl:variable>
     
      <xsl:template match="/ | @* | * | comment() | processing-instruction() | text()"> 
      	<xsl:copy> 
      		<xsl:apply-templates select="@* | * | comment() | processing-instruction() | text()"/> 
      	</xsl:copy> 
      </xsl:template> 
     
       <xsl:template match="property/@*">
    		<xsl:variable name="oldName" select="name()"/>
    		<xsl:variable name="oldValue" select="."/>
    		<xsl:variable name="newAttName" select="msxml:node-set($modifications)/adds/attribute[@property=$oldValue]/@newAttrName"/>
    		<xsl:variable name="newValueName" select="msxml:node-set($modifications)/adds/attribute[@property=$oldValue]/@newAttrValue"/>
    		<!-- <test oldName="{$oldName}" oldValue="{$oldValue}" t1="{$newAttName}" t2="{$newValueName}"/> -->
     
    		<xsl:if test="string-length($newAttName) != 0">
    			<xsl:attribute name="{$newAttName}">
    				<xsl:value-of select="$newValueName"/>
    			</xsl:attribute>
    		</xsl:if>
    		<xsl:attribute name="{$oldName}"><xsl:value-of select="$oldValue"/></xsl:attribute>
     
    	</xsl:template>
    </xsl:stylesheet>
    Faut juste virer xmlns:msxml="urn:schemas-microsoft-com:xslt", extension-element-prefixes="msxml" et les références à msxml:node-set() qui sont spécifique à la gestion des nodeset du processeur msxml.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 78
    Points : 62
    Points
    62
    Par défaut
    Merci beaucoup, ton code fonctionne parfaitement, j'ai juste fait quelques modifications pour mieux le comprendre et pour pouvoir l'exécuter sur ma config, voici ce qu'il donne :
    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
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:exsl="http://exslt.org/common"
                    extension-element-prefixes="exsl"
                    version="1.0">
       <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
       <xsl:variable name="modifications">
          <adds>
             <attribute property="Languague" newAttrName="node" newAttrValue="@Language" />
             <attribute property="Votitlelanguage" newAttrName="node" newAttrValue="@Votitlelanguage" />
          </adds>
       </xsl:variable>
      <xsl:template match="/ | @* | * | comment() | processing-instruction() | text()"> 
      	<xsl:copy> 
      		<xsl:apply-templates select="@* | * | comment() | processing-instruction() | text()"/> 
      	</xsl:copy> 
      </xsl:template> 
       <xsl:template match="property/@*">
    		<xsl:variable name="currentAttrName" select="name()"/>
    		<xsl:variable name="currentAttrValue" select="."/>
    		<xsl:variable name="newAttrName" select="exsl:node-set($modifications)/adds/attribute[@property=$currentAttrValue]/@newAttrName"/>
    		<xsl:variable name="newAttrValue" select="exsl:node-set($modifications)/adds/attribute[@property=$currentAttrValue]/@newAttrValue"/>
    		<xsl:attribute name="{$currentAttrName}"><xsl:value-of select="$currentAttrValue"/></xsl:attribute>
    		<xsl:if test="string-length($newAttrName) != 0">
    			<xsl:attribute name="{$newAttrName}">
    				<xsl:value-of select="$newAttrValue"/>
    			</xsl:attribute>
    		</xsl:if>
    	</xsl:template>
    </xsl:stylesheet>
    Je constate que j'avais pris le problème à l'envers, la logique XSLT est différente des autres langages de prog que je connais.

Discussions similaires

  1. Utilisation d'une Variable(Vb) dans d'autre language
    Par cach dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 22/02/2005, 12h00
  2. Pl/SQL utilisation d'une variable dans un select
    Par larg dans le forum PL/SQL
    Réponses: 17
    Dernier message: 30/11/2004, 17h08
  3. utilisation d'une variable globale
    Par ZZ dans le forum ASP
    Réponses: 3
    Dernier message: 03/12/2003, 19h11
  4. Utilisation d'une variable sur plusieurs unités
    Par Yamaneko dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2003, 11h23
  5. Réponses: 4
    Dernier message: 05/06/2002, 14h35

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