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 :

XML vers XML avec XSL


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 3
    Points : 2
    Points
    2
    Par défaut XML vers XML avec XSL
    Bonjour à tous,

    Voilà je débute en XSL et je souhaiterais transformer un document XML vers un autre XML.

    Voici le XML source :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <par class="LIV">Livre 1<inline class="T">Ceci est un essai</inline></par>
    <par class="ALNUM" xml:lang="fr"><inline class="NUMGRAS">46.</inline>Ceci est le début d'une phrase.</par>
    Voici le 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
    45
    46
    47
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:template match="*|/">
    		<xsl:apply-templates/>
    	</xsl:template>
     
    	<xsl:template match="inline">
    		<xsl:if test="not(@class='font-style: italic;') and not(@class='vertical-align: super;') and not(@class='font-weight: bold;')">
    			<xsl:variable name="maVariable4" select="@class"/>
    			<xsl:element name="{$maVariable4}">
    				<xsl:value-of select="."/>
    			</xsl:element>
    		</xsl:if>
     
    		<xsl:if test="@class='font-style: italic;'">
    			<xsl:variable name="maVariable" select="I"/>
    			<xsl:element name="{$maVariable}">
    				<xsl:value-of select="."/>
    			</xsl:element>
    		</xsl:if>
     
    		<xsl:if test="@class='vertical-align: super;'">
    			<xsl:variable name="maVariable2" select="E"/>
    			<xsl:element name="{$maVariable2}">
    				<xsl:value-of select="."/>
    			</xsl:element>
    		</xsl:if>
     
    		<xsl:if test="@class='font-weight: bold;'">
    			<xsl:variable name="maVariable3" select="B"/>
    			<xsl:element name="{$maVariable3}">
    				<xsl:value-of select="."/>
    			</xsl:element>
    		</xsl:if>
    	</xsl:template>
     
    	<xsl:template match="par">
    		<xsl:variable name="maVariable" select="@class"/>
    		<xsl:element name="{$maVariable}">
    			<xsl:value-of select="."/>
    			<xsl:apply-templates select="inline"/>
    		</xsl:element>
    	</xsl:template>
     
    	<xsl:template match="style">
    	</xsl:template>
    </xsl:stylesheet>
    Voici le xml de sortie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?xml version="1.0" encoding="UTF-16"?><LIV>Livre 1Ceci est un essai<T>Ceci est un essai</T></LIV><ALNUM>46.Ceci est le début d'une phrase.<NUMGRAS>46.</NUMGRAS></ALNUM>
     
    En fait je voudrais obtenir ceci :
     
    <?xml version="1.0" encoding="UTF-16"?><LIV>Livre 1<T>Ceci est un essai</T></LIV><ALNUM><NUMGRAS>46.<NUMGRAS>Ceci est le début d'une phrase.</ALNUM>
    Je ne vois pas ce qui coince dans ma feuille XSL. Si quelqu'un peut m'aider ce serait sympa.

    Merci

  2. #2
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 3
    Points : 2
    Points
    2
    Par défaut RE : XML vers XML
    Bonjour,

    N'y a t'il vraiment personne pour m'aider ou ou moins m'orienter ?

    Peut-être que ma question n'est pas claire ?

    Merci

  3. #3
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    j'ai relevé plusieurs choses dans ton XSLT :

    1) ce template est inutile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       <xsl:template match="*|/"> 
          <xsl:apply-templates/> 
       </xsl:template>
    Il correspond à un template par défaut déjà défini en interne dans le processeur XSLT. Inutile donc de le placer dans ta feuille de style.

    2) De la façon dont tu as écrit ton template "par", le contenu des balises <inline> est inséré deux fois : une première fois par le xsl:value-of qui envoie en sortie tous les noeuds textes descendants de <par>, y compris donc les noeuds textes des balises <inline> imbriquées, et une deuxième fois par le <xsl:apply-templates>. Le template correctement écrit donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      <xsl:template match="par"> 
          <xsl:element name="{@class}"> 
             <xsl:apply-templates/> 
          </xsl:element> 
       </xsl:template>
    Tu remarqueras qu'il est possible de se passer d'une déclaration de variable.

    3) Plutôt qu'avoir un seul template <inline> dans lequel toutes les possibilités de valeurs de l'attribut class sont testées, il est préférable d'avoir un template par cas :
    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:template match="inline[@class = 'font-style: italic;']">
    ...
    </xsl:template>
     
    <xsl:template match="inline[@class = 'vertical-align: super;']">
    ...
    </xsl:template>
     
    <xsl:template match="inline[@class = 'font-weight: bold;']">
    ...
    </xsl:template>
     
    <xsl:template match="inline">
    <!-- template traitant les inline non traités par les templates précédents -->
    ...
    </xsl:template>
    Cela rendra ton code plus lisible.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  4. #4
    Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci de cette réponse.

    C'est parfait, c'est exactement ce que je voulais.

    Encore merci.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/03/2008, 19h30
  2. Réponses: 7
    Dernier message: 04/06/2007, 15h51
  3. [XSLT]Passer du XML au CSV avec XSL
    Par tibotibotibo dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 16/03/2007, 11h12
  4. [XSLT] probleme de copie de balise de XML vers HTML via XSL
    Par Clercq dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 27/11/2006, 13h52
  5. [débutant]XML vers XML avec XSL
    Par tokamak dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 11/07/2005, 10h27

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