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 :

compléter un fichier XML


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Points : 186
    Points
    186
    Par défaut compléter un fichier XML
    J'ai pu faire un fichier xsl qui transforme le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <ObjetRecupere>
      <Application>
        <Identifiant>m00lxfSR4nd0</Identifiant>
        <version>1.0</version>
        <Nom>Calcul de réserve</Nom>
      </Application>
      <Lien>
        <Nom>Message-Reçu</Nom>
        <ID_Source>m00lxfSR4nd0</ID_Source>
        <ID_Destination>i4bvVF)a(0b0</ID_Destination>
      </Lien>
    </ObjetRecupere>
    pour donner une version aussi complète en terme d'information, mais beaucoup moins lourde
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <ObjetRecupere>
      <Application>
        <Identifiant>m00lxfSR4nd0</Identifiant>
        <version>1.0</version>
        <Nom>Calcul de réserve</Nom>
      </Application>
      <Lien type="Message-Reçu">i4bvVF)a(0b0</Lien>
    </ObjetRecupere>
    J'ai fait cela avec un unique template :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="Lien" priority="2">
      <Lien type="{Nom}">
        <xsl:value-of select="ID_Destination"/>
      </Lien>
    </xsl:template>
    Malheureusement, j'apprends qu'il faut finalement faire l'inverse, c'est à dire partir du 2eme fichier XML pour aboutir au 1er.

    Sachant qu'il faut en fait triturer chacun des "ObjetRecupere", pour transformer chacun de ses Liens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Lien type="TYPELIEN">ID_Objet_Lié</Lien>
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <Lien>
        <Nom>TypeLien</Nom>
        <ID_Source>IDObjetDecrit</ID_Source>
        <ID_Destination>ID_Objet_Lié</ID_Destination>
      </Lien>
    Autant, même en débutant, j'avais fini par tritouiller quelque chose pour supprimer des balises superflues. autant là, la conversion inverse me pose énormément de problème.

    Une petite piste serait sans refus

  2. #2
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Points : 186
    Points
    186
    Par défaut
    J'ai pu arriver à refaire tous mes liens comme je le voulais en faisant le XSLT qui suit
    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
    <xsl:template match="ObjetRecupere" priority="1">
    <!-- pour l'instant ca marche que pour l'objet application : voir ensuite comment généraliser -->		
    <xsl:variable name="identifiant"><xsl:value-of select="*/Identifiant_absolu"/></xsl:variable>
    		<xsl:for-each select="Lien">
    			<xsl:call-template name="EcrireLien">
    				<xsl:with-param name="source" select="$identifiant"/>
    				<xsl:with-param name="nom">
    					<xsl:value-of select="@type"/>
    				</xsl:with-param> 
    				<xsl:with-param name="destination">
    					<xsl:value-of select="."/>
    				</xsl:with-param>
    			</xsl:call-template>
    		</xsl:for-each>
    </xsl:template>
    <xsl:template name="EcrireLien">
    	<xsl:param name="nom"/>
    	<xsl:param name="source"/>
    	<xsl:param name="destination"/>
    	<Lien>
    		<Nom><xsl:value-of select="$nom"/></Nom>
    		<ID_Source><xsl:value-of select="$source"/></ID_Source>
    		<ID_Destination><xsl:value-of select="$destination"/></ID_Destination>
    	</Lien>
    </xsl:template>

  3. #3
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 275
    Points : 186
    Points
    186
    Par défaut
    Il manquait juste un dernier élément permettant de finaliser la totalité de la trsanformation

    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
    49
    50
    51
    52
    53
    54
    55
    56
    <?xml version="1.0" encoding="ISO-8859-15"?>
    <xsl:transform  version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="xml" version="1.0" encoding="ISO-8859-15" indent="yes"/>
      <xsl:template match="node()" priority="1">
        <xsl:copy>
          <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
      </xsl:template>
    <!-- règles pour les contenus de balise : on recopie -->
      <xsl:template match="text()" priority="1">
        <xsl:value-of select="."/> 
      </xsl:template>
    <!-- regle pour les balises : on recopie -->
      <xsl:template match="@*" priority="1">
        <xsl:attribute name="{name()}">
          <xsl:value-of select="."/>
        </xsl:attribute> 
      </xsl:template>
      <xsl:template match="ObjetRecupere" priority="1">
        <xsl:copy>
          <xsl:apply-templates select="Application|Site|Message"/>
          <xsl:variable name="identifiant"><xsl:value-of select="*/Identifiant_absolu"/></xsl:variable>
          <xsl:for-each select="Lien">
            <xsl:call-template name="EcrireLien">
              <xsl:with-param name="source" select="$identifiant"/>
              <xsl:with-param name="nom">
                <xsl:value-of select="@type"/>
              </xsl:with-param> 
              <xsl:with-param name="destination">
                <xsl:value-of select="."/>
              </xsl:with-param>
            </xsl:call-template>
          </xsl:for-each>
        </xsl:copy>
      </xsl:template>
      <xsl:template name="EcrireLien">
        <xsl:param name="nom"/>
        <xsl:param name="source"/>
        <xsl:param name="destination"/>
        <Lien>
          <Nom><xsl:value-of select="$nom"/></Nom>
          <ID_Source><xsl:value-of select="$source"/></ID_Source>
          <ID_Destination><xsl:value-of select="$destination"/></ID_Destination>
        </Lien>
      </xsl:template>
      <xsl:template match="Application">
        <xsl:apply-templates select="node()|@*"/>
      </xsl:template>
      <xsl:template match="Message">
        <xsl:apply-templates select="node()|@*"/>
      </xsl:template>
      <xsl:template match="Site">
        <xsl:apply-templates select="node()|@*"/>
      </xsl:template>
    </xsl:transform>

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 04/08/2009, 19h01
  2. Réponses: 1
    Dernier message: 07/08/2007, 16h55
  3. Lire un attribut dans un fichier XML en C++
    Par ti.k-nar dans le forum XML
    Réponses: 2
    Dernier message: 14/10/2002, 15h22
  4. [Kylix] Composant IBM pour fichiers XML
    Par Mister Nono dans le forum EDI
    Réponses: 1
    Dernier message: 29/09/2002, 20h28
  5. Balises HTML dans un fichier XML
    Par Bastet79 dans le forum XML/XSL et SOAP
    Réponses: 12
    Dernier message: 04/09/2002, 15h29

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