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][Débutant] Transformer un fichier XML en un autre fichier XML


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 23
    Points : 18
    Points
    18
    Par défaut [XSLT][Débutant] Transformer un fichier XML en un autre fichier XML
    Tout d'abord bonjour à tous,

    Je suis nouveau sur le forum donc je me présente,je suis étudiant en informatique et je recherche des informations qui pourrait m'aider à continuer un travail.

    J'ai recherché d'abord sur le forum si il n'y avait pas de sujet équivalent et je n'ai trouvé que des réponses qui ne correpondent pas exactement à mes questions.


    Voilà je vous expose mon probleme,j'ai un fichier XML du 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    <?xml version="1.0" encoding="UTF-8"?><tmx version="1.0"><header creationtoolversion=".." datatype="text" segtype="sentence" adminlang="EN-US" srclang="en" o-tmf="unknow" creationtool=".."></header>
     
    <body>
     
    <tu> 
     
    <tuv xml:lang="en"><prop type="data:type"> source </prop><prop type="ID">0:Title</prop>
     
    <seg>English sentence 1</seg>
     
    </tuv>
     
    <tuv xml:lang="fr"><prop type="data:type"> source </prop><prop type="ID">0:Title</prop>
     
    <seg>Phrase Francaise 1</seg>
     
    </tuv></tu>
     
    <tu> 
     
    <tuv xml:lang="en"><prop type="data:type"> source </prop><prop type="ID">1:Title</prop>
     
    <seg>English sentence 2</seg>
     
    </tuv>
     
    <tuv xml:lang="fr"><prop type="data:type"> source </prop><prop type="ID">1:Title</prop>
     
    <seg>Phrase Francaise 2</seg>
     
    </tuv></tu>
     
    </body></tmx>

    En un fichier XML comme celà:


    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
     
    <?xml version="1.0" encoding="UTF-8"?>
     
    <rows>
     
    	<row id="0">
     
    		<cell xml:lang="en"><![CDATA[English sentence 1]]></cell>
     
    		<cell xml:lang="fr"><![CDATA[Phrase Francaise 1]]></cell>
     
    		</row>
     
    	<row  id="1">
     
    		<cell xml:lang="en"><![CDATA[English sentence 2]]></cell>
     
    		<cell xml:lang="fr"><![CDATA[Phrase Francaise 2]]></cell>
     
    		</row>
     
    </rows>
    Les <![CDATA[..]]> , c'est pour pouvoir lire les effets visuels mais ce n'est pas tres important pour l'instant.

    Donc voilà,j'ai lu qu'il me faudrait utiliser un fichier XSL donc j'ai crée un fichier XSL que voilà:

    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
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
     
    <?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"
     
      encoding="UTF-8"
     
      indent="yes" />
     
     
     
    <xsl:template match="body">
     
     
     
    	<rows>
     
          <xsl:apply-templates select="tu" />
     
    	</rows>
     
     
     
    </xsl:template>
     
     
     
    <xsl:template match="tu">
     
    <xsl:param name="a" select="0" />
     
      <row id="0">
     
          <xsl:apply-templates select="tuv" />
     
      </row>
     
    </xsl:template>
     
     
     
    <xsl:template match="tuv">
     
    <xsl:variable name="xml:lang"><xsl:value-of select="@xml:lang" /></xsl:variable>
     
    	<cell xml:lang='$xml:lang'>
     
        <!--<xsl:value-of select="@xml:lang" />-->
     
        <!--<xsl:apply-templates select="prop" />-->
     
    	<xsl:apply-templates select="seg" />
     
        </cell>	
     
    </xsl:template>
     
     
     
    <xsl:template match="prop">
     
      <!--<xsl:if test="type='ID'">-->
     
     
     
        <xsl:value-of select="." />
     
      <!--</xsl:if>-->
     
    </xsl:template>
     
     
     
    <xsl:template match="seg">
     
        <xsl:value-of select="." />
     
    </xsl:template>
     
     
     
    </xsl:stylesheet>
    Et donc ce fichier xsl me creer (avec une fonction php),un fichier xml comme celà:

    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
     
     
    <?xml version="1.0" encoding="UTF-8"?>
     
     
     
    <rows>
     
      <row id="0">
     
        <cell xml:lang="$xml:lang">English sentence 1</cell>
     
        <cell xml:lang="$xml:lang">Phrase Francaise 1</cell>
     
      </row>
     
      <row id="0">
     
        <cell xml:lang="$xml:lang">English sentence 2</cell>
     
     
     
        <cell xml:lang="$xml:lang">Phrase Francaise 2</cell>
     
      </row>
     
    </rows>
    Ce qui est proche de ce que je veux mais j'ai deux petit probleme:
    Il faudrait que j'arrive à incrémenter mon "id",car la je l'ai mis à 0 pour avoir l'idée mais je n'arrive pas à l'incrémenter et ensuite meme genre de probleme,j'ai essayer de définir une variable xml:lang mais lorsque je veux insérer la variable dans mon fichier,elle n'est pas prise comme une variable mais une chaine de caractere...donc elle ne peut pas etre modifiée.

    Voilà je vais continuer à rechercher mais si quelqu'un savait ou voyait comment faire celà m'aiderait grandement.

    Merci de vos réponses

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Bon alors j'ai encore avancé,il me reste maintenant plus qu'un probleme:
    L'incrémentation de mon id....j'ai vu que l'on ne pouvais pas changer la valeur des variables en XSL mais il doit bien y avoir un moyen d'incrémenter mon id non?

    Je vous donne mon fichier XSL :
    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
     
    <?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"
      encoding="UTF-8"
      indent="yes" />
     
    <xsl:template match="body">
     
    	<rows>
          <xsl:apply-templates select="tu" />
    	</rows>
     
    </xsl:template>
     
    <xsl:template match="tu">
     
    	<xsl:variable name="id" select="1"/>
    	<row id='{$id}'>
    	<xsl:apply-templates select="seg" />
    	</row>
     
    </xsl:template>
     
    <xsl:template match="tuv">
    	<xsl:variable name="lang" select="@xml:lang"/>
    	<cell xml:lang='{$lang}'>
    	<xsl:apply-templates select="seg" />
        </cell>	
    </xsl:template>
     
    <xsl:template match="prop">
      <!--<xsl:if test="type='ID'">-->
     
        <xsl:value-of select="." />
      <!--</xsl:if>-->
    </xsl:template>
     
    <xsl:template match="seg">
        <xsl:value-of select="." />
    </xsl:template>
     
    </xsl:stylesheet>
    et maintenant mon fichier XML de 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    <?xml version="1.0" encoding="UTF-8"?>
     
     
     
    <rows>
     
      <row id="0">
     
        <cell xml:lang="en">English sentence 1</cell>
     
        <cell xml:lang="fr">Phrase Francaise 1</cell>
     
      </row>
     
      <row id="0">
     
        <cell xml:lang="en">English sentence 2</cell>
     
        <cell xml:lang="fr">Phrase Francaise 2</cell>
     
      </row>
     
    </rows>
    Voilà,j'ai cherché des réponses mais à chaque fois que j'essaye un truc ca ne marche pas...
    Merci pour votre aide

  3. #3
    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
    Bonsoir,
    Ca devrait mieux marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <xsl:template match="body">
     
    	<rows>
            <xsl:for-each select="tu">
               <row id='{position()}'>
    	   <xsl:apply-templates select="seg" />
    	  </row>
            </xsl:for-each/>
    	</rows>
     
    </xsl:template>

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Nickel,c'est parfait merci beaucoup Morbo:

    Je vais mettre le post en [RESOLU],maintenant je n'ai plus qu'a essayer de m'occuper des tags <![CDATA[..]]> car je crois qu'on peut les gérer avec XSL?Je vous ferai signe si j'ai besoin d'aide.

    Je mets donc mon fichier XSL final ici si ca peut servir à quelqu'un:

    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">
     
    <xsl:output method="xml"
      encoding="UTF-8"
      indent="yes" />
     
    <xsl:template match="body">  
    <rows>  
    <xsl:for-each select="tu">  
    <row id='{position()-1}'>  
    <xsl:apply-templates select="tuv" />  
    </row>  
    </xsl:for-each>  
    </rows>  
    </xsl:template>
     
    <xsl:template match="tuv">
    	<xsl:variable name="lang" select="@xml:lang"/>
    	<cell xml:lang='{$lang}'>
    	<xsl:apply-templates select="seg" />
        </cell>	
    </xsl:template>
     
    <xsl:template match="prop">
      <xsl:value-of select="." />
    </xsl:template>
     
    <xsl:template match="seg">
        <xsl:value-of select="." />
    </xsl:template>
     
    </xsl:stylesheet>
    et le fichier XML de 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    <?xml version="1.0" encoding="UTF-8"?>
     
     
     
    <rows>
     
      <row id="0">
     
        <cell xml:lang="en">English sentence 1</cell>
     
        <cell xml:lang="fr">Phrase Francaise 1</cell>
     
      </row>
     
      <row id="1">
     
        <cell xml:lang="en">English sentence 2</cell>
     
        <cell xml:lang="fr">Phrase Francaise 2</cell>
     
      </row>
     
    </rows>
    Voilà,Merci beaucoup et bonne journée

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

Discussions similaires

  1. Copier d'un noeud Xml dans un autre fichier
    Par riderfun dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 25/03/2009, 13h16
  2. Réponses: 2
    Dernier message: 18/12/2008, 14h38
  3. Réponses: 22
    Dernier message: 27/08/2008, 15h35
  4. [DOM] (org.w3c.dom) copier un noeud d'un fichier XML dans un autre fichier XML
    Par snoop dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 13/02/2007, 18h22
  5. Importer le contenu un fichier xml dans un autre fichier xml
    Par gedeon555 dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 27/07/2005, 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