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 :

[XSLT] Réutiliser une variable définie dans une boucle


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2006
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 51
    Points : 35
    Points
    35
    Par défaut [XSLT] Réutiliser une variable définie dans une boucle
    Bonjour,

    Est ce que quelqu'un peu m'aider parce que je ne m'en sors pas.

    Je souhaite modifier un fichier xml c'est à dire que certains éléments d'un noeud selon certaines conditions doivent être déplacés dans un autre noeud.

    Mon XML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <catalog>
    <div style="margin-left:40px"><item id="a"></div><div style="margin-left:40px"><div style="margin-left:40px"><medium>text</medium></div></div><div style="margin-left:40px"><div style="margin-left:40px"><description>blablabla</description></div></div><div style="margin-left:40px"><div style="margin-left:40px"><requires>xxxxx:a_Sound</requires></div></div></item>
    <div style="margin-left:40px"><item id="a_Sound"></div><div style="margin-left:40px"><div style="margin-left:40px"><medium>audio</medium></div></div><div style="margin-left:40px"><div style="margin-left:40px"><isRequiredBy>xxxxx:a</isRequiredBy></div></div><div style="margin-left:40px"></item></div><div style="margin-left:40px"><item id="b"></div><div style="margin-left:40px"><div style="margin-left:40px"><medium>text</medium></div></div><div style="margin-left:40px"><div style="margin-left:40px"><description>blablabla</description></div></div><div style="margin-left:40px"><div style="margin-left:40px"><requires>xxxxx:b_Sound</requires></div></div></item>
    <div style="margin-left:40px"><item id="b_Sound"></div><div style="margin-left:40px"><div style="margin-left:40px"><medium>audio</medium></div></div><div style="margin-left:40px"><div style="margin-left:40px"><isRequiredBy>xxxxx:b</isRequiredBy></div></div><div style="margin-left:40px"></item></div></catalog>
    En fait ce que je veux obtenir c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <catalog>
    <div style="margin-left:40px"><item id="a"></div><div style="margin-left:40px"><div style="margin-left:40px"><medium>text</medium></div></div><div style="margin-left:40px"><div style="margin-left:40px"><requires>xxxxx:a_Sound</requires></div></div></item>
    <div style="margin-left:40px"><item id="a_Sound"></div><div style="margin-left:40px"><div style="margin-left:40px"><medium>audio</medium></div></div><div style="margin-left:40px"><div style="margin-left:40px"><description>blablabla</description></div></div><div style="margin-left:40px"><div style="margin-left:40px"><isRequiredBy>xxxxx:a</isRequiredBy></div></div><div style="margin-left:40px"></item></div><div style="margin-left:40px"><item id="b"></div><div style="margin-left:40px"><div style="margin-left:40px"><medium>text</medium></div></div><div style="margin-left:40px"><div style="margin-left:40px"><requires>xxxxx:b_Sound</requires></div></div></item>
    <div style="margin-left:40px"><item id="b_Sound"></div><div style="margin-left:40px"><div style="margin-left:40px"><medium>audio</medium></div></div><div style="margin-left:40px"><div style="margin-left:40px"><description>blablabla</description></div></div><div style="margin-left:40px"><div style="margin-left:40px"><isRequiredBy>xxxxx:b</isRequiredBy></div></div><div style="margin-left:40px"></item></div></catalog>
    <requires>xxxxx:a_Sound</requires> OU
    <requires>xxxxx:b_Sound</requires>
    <isRequiredBy>xxxxx:a</isRequiredBy> ou <isRequiredBy>xxxxx:b</isRequiredBy>
    Pour ces cas là, il faut récupérer ce qui suit après 'xxxxx:'
    Soit a_sound (ou b_Sound) ou a (ou b) Ce qui correspond alors à la valeur de l'attribut id de <item>.

    Je veux déplacer <description> des item qui ne sont pas des audio dans le noeud <item> qui a comme attribut id la même valeur que la valeur récupérée dans <requires>.

    Voilà ce que j'ai commencé à faire pour me permettre de récupérer les idItem Mon XSLT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <xsl:template match="catalog">
    <div style="margin-left:40px"><xsl:for-each select="item[contains(medium, 'audio') and (dcterms:isRequiredBy) and not(dc:description)] "></div><div style="margin-left:40px"><div style="margin-left:40px"><xsl:for-each select="dcterms:isRequiredBy"></div></div><div style="margin-left:40px"><div style="margin-left:40px"><div style="margin-left:40px"><xsl:variable name="idItem" select="substring-after(.,'xxxxx')"/></div></div></div><div style="margin-left:40px"><div style="margin-left:40px"><div style="margin-left:40px"><xsl:call-template name="id"></div></div></div><div style="margin-left:40px"><div style="margin-left:40px"><div style="margin-left:40px"><xsl:with-param name="idItem"><xsl:value-of select="$idItem"/></xsl:with-param></div></div></div>		<div style="margin-left:40px"><div style="margin-left:40px"><div style="margin-left:40px"></xsl:call-template></div></div></div><div style="margin-left:40px"><div style="margin-left:40px"></xsl:for-each></div></div><div style="margin-left:40px"></xsl:for-each></div><div style="margin-left:40px">
    <xsl:for-each select="item[not(contains(medium, 'audio'))]"></div><div style="margin-left:40px"><div style="margin-left:40px"><xsl:variable name="idAnnotation" select="@id"/></div></div><div style="margin-left:40px"><div style="margin-left:40px"><xsl:call-template name="idAnno"></div></div><div style="margin-left:40px"><div style="margin-left:40px"><div style="margin-left:40px"><xsl:with-param name="idAnnotation"><xsl:value-of select="$idAnnotation"/></xsl:with-param></div></div></div><div style="margin-left:40px"><div style="margin-left:40px"></xsl:call-template></div></div><div style="margin-left:40px"></xsl:for-each></div></xsl:template>
     
    <xsl:template name="id">
    <div style="margin-left:40px"><xsl:param name="idItem"></xsl:param></div>	<div style="margin-left:40px"><div style="margin-left:40px"><xsl:value-of select="$idItem"/></div></div></xsl:template>
     
    <xsl:template name="idAnno">
    	<div style="margin-left:40px"><xsl:param name="idAnnotation"></xsl:param></div>	<div style="margin-left:40px"><xsl:value-of select="$idAnnotation"/></div></xsl:template>
    Je veux récupérer ma variable idItem pour permettre de de faire un
    <xsl:if test ="$idItem=$idAnnotation">
    <xsl:copy-of select="description>
    </xsl:if>


    Je ne sais pas si je suis claire mais si quelqu'un comprend est ce qu'il a une idée de la façon par laquelle je peux résoudre ce pb ?
    Merci

  2. #2
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    qq corrections


    deja il vaut mieux ecrire


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:call-template name="idAnno">
    <xsl:with-param name="idAnnotation" select="$idAnnotation"/>
    </xsl:call-template>
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xsl:call-template name="id">
    <xsl:with-param name="idItem"  select="$idItem"/> 
    </xsl:call-template>
    ensuite je partirais plutot vers une solution de ce type

    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
    <?xml version="1.0"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     
      <xsl:output method="xml" indent="yes"/> 
     
      <xsl:template match="*"> 
       <xsl:copy> 
         <xsl:apply-templates select="*|@*|text()"/> 
       </xsl:copy> 
      </xsl:template> 
          <xsl:template match="@*"> 
       <xsl:attribute name="{name()}"> 
         <xsl:value-of select="."/>    
       </xsl:attribute> 
      </xsl:template> 
       <xsl:template match="text()"> 
        <xsl:value-of select="."/>    
      </xsl:template> 
       <xsl:template match="item"> 
       <xsl:copy> 
         <xsl:apply-templates select="*[not(self::description)]|@*"/> 
         <xsl:choose>
    						<xsl:when test="requires and ../item[@id=substring-after(current()/requires,'xxxxx:')]">
     
    						<xsl:apply-templates select="../item[@id=substring-after(current()/requires,'xxxxx:')]/description"/> 
    						</xsl:when>
    						<xsl:when test="isRequiredBy and ../item[@id=substring-after(current()/isRequiredBy,'xxxxx:')]">
    						<xsl:apply-templates select="../item[@id=substring-after(current()/isRequiredBy,'xxxxx:')]/description"/> 
    						</xsl:when>
    						<xsl:otherwise><xsl:apply-templates select="description"/> </xsl:otherwise>
    	</xsl:choose>
       </xsl:copy> 
      </xsl:template> 
     
    </xsl:stylesheet>

Discussions similaires

  1. [XL-2007] Utilisation d'une variable définie dans une formule classique
    Par Runsh63 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 14/09/2011, 16h47
  2. Réponses: 10
    Dernier message: 15/06/2011, 11h30
  3. Réponses: 6
    Dernier message: 21/07/2009, 11h37
  4. Réponses: 9
    Dernier message: 23/06/2009, 10h54
  5. [XSLT] Réutiliser un contexte mémorisé dans une variable
    Par camboui dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 02/01/2006, 12h49

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