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] Attributs -> Elements


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre du Club

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 38
    Points : 49
    Points
    49
    Par défaut [XSLT] Attributs -> Elements
    Bonjour,
    je rencontre actuellement un soucis dans la transformation d'attributs en éléments. En effet je désire convertir tous les attributs de mon document XML en éléments.
    Etant débutant en technologie XSL/XSLT je me suis tourné vers google et j'ai trouvé ce bout de code:
    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
    <?xml version = '1.0' encoding = 'ISO-8859-1'?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   version="1.0">
      <xsl:output indent="yes" />
      <xsl:strip-space elements="*" />
      <xsl:template match="*">
        <xsl:copy>
          <xsl:if test="@*">
            <xsl:for-each select="@*">
              <xsl:element name="{name()}">
                <xsl:value-of select="." />
              </xsl:element>
            </xsl:for-each>
          </xsl:if>
          <xsl:apply-templates />
        </xsl:copy>
      </xsl:template>
    </xsl:stylesheet>
    Malheureusement, il ne me convient pas à 100% et je n'arrive pas à le modifier de manière à obtenir le résultat tant attendu.
    En effet, ce code fonctionne trop bien car il transforme même les attributs particuliers (xsi:*, xmlns:*) en élément ce qui est assez gênant.

    Voici un extrait du document XML à transformer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version = '1.0' encoding = 'ISO-8859-1'?>
    <parameters xsi:noNamespaceSchemaLocation="parametres.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <client id="XXX" name="HOTEL-Blablablabla" street="Rue de blablabla" zip="XXXXX" city="VILLE" phone="123456789" email="x@y.ch" canton="YX">
          <product id="500" idinternal="200,201,213,236">
             <subposition id="101" type="0">
                <employeepart type="false" man="5.05" woman="5.05"/>
                <employerpart man="5.05" woman="5.05" additionalcost="3.45" administrationcost="3"/>
             </subposition>
    ...
    Résultat avec le bout de code ci-dessus:
    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
    <?xml version = '1.0'?>
    <parameters>
       <xsi:noNamespaceSchemaLocation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">parametres.xsd</xsi:noNamespaceSchemaLocation>
       <xmlns:xsi xmlns:xmlns="http://www.w3.org/2000/xmlns/">http://www.w3.org/2001/XMLSchema-instance</xmlns:xsi>
       <client>
          <id>XXX</id>
          <name>HOTEL-Blablablabla</name>
          <street>Rue de blablabla</street>
          <zip>XXXXX</zip>
          <city>VILLE</city>
          <phone>123456789</phone>
          <email>x@y.ch</email>
          <canton>YX</canton>
          <product>
             <id>500</id>
             <idinternal>200,201,213,236</idinternal>
             <subposition>
                <id>101</id>
                <type>0</type>
                <employeepart>
                   <type>false</type>
                   <man>5.05</man>
                   <woman>5.05</woman>
                </employeepart>
                <employerpart>
                   <man>5.05</man>
                   <woman>5.05</woman>
                   <additionalcost>3.45</additionalcost>
                   <administrationcost>3</administrationcost>
                </employerpart>
             </subposition>
    ...
    Résultat attendu:
    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 = 'ISO-8859-1'?>
    <parameters xsi:noNamespaceSchemaLocation="parametres.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <client>
          <id>XXX</id>
          <name>HOTEL-Blablablabla</name>
          <street>Rue de blablabla</street>
          <zip>XXXXX</zip>
          <city>VILLE</city>
          <phone>123456789</phone>
          <email>x@y.ch</email>
          <canton>XY</canton>
          <product>
             <id>500</id>
             <idinternal>200,201,213,236</idinternal>
             <subposition>
                <id>101</id>
                <type>0</type>
                <employeepart>
                   <type>false</type>
                   <man>5.05</man>
                   <woman>5.05</woman>
                </employeepart>
                <employerpart>
                   <man>5.05</man>
                   <woman>5.05</woman>
                   <additionalcost>3.45</additionalcost>
                   <administrationcost>3</administrationcost>
                </employerpart>
             </subposition>
    La question: Comment transformer l'arborescence de "parameters" en éléments sans modifier les attributs particulier de parameters?

    Merci de votre attention.
    Je vous souhaite un excellent après-midi.

  2. #2
    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,

    il suffit d'appliquer un template particulier à parameters, ceci devrait faire l'affaire :
    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
    <?xml version = '1.0' encoding = 'ISO-8859-1'?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   version="1.0">
      <xsl:output indent="yes" />
      <xsl:strip-space elements="*" />
      <xsl:template match="parameters">
        <xsl:copy>
          <xsl:copy-of select="@*"/>
          <xsl:apply-templates/>
        </xsl:copy>
      </xsl>
      <xsl:template match="*">
        <xsl:copy>
            <xsl:for-each select="@*">
              <xsl:element name="{name()}">
                <xsl:value-of select="." />
              </xsl:element>
            </xsl:for-each>
          <xsl:apply-templates />
        </xsl:copy>
      </xsl:template>
    </xsl:stylesheet>
    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

  3. #3
    Membre du Club

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 38
    Points : 49
    Points
    49
    Par défaut
    Merci beaucoup GrandFather, tu m'as débloqué.

    Voici la version finale du code:
    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
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">
    	<xsl:output method="xml" version="1.0" encoding="ISO-8859-1" indent="yes"/>
    	<xsl:strip-space elements="*"/>
    	<xsl:template match="parameters">
    			<xsl:copy>
    				<xsl:apply-templates/>
    			</xsl:copy>
    	</xsl:template>
    	<xsl:template match="*">
    		<xsl:copy>
    			<xsl:for-each select="@*">
    				<xsl:element name="{name()}">
    					<xsl:value-of select="."/>
    				</xsl:element>
    			</xsl:for-each>
    			<xsl:apply-templates/>
    		</xsl:copy>
    	</xsl:template>
    </xsl:stylesheet>
    J'ai juste retiré la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:copy-of select="@*"/>
    pour pas qu'il remette l'attribut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xsi:noNamespaceSchemaLocation="parametres.xsd"
    Forcément, le nouveau fichier XML ne correspond plus à l'ancien XSD.
    Encore merci pour cette réponse rapide.

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

Discussions similaires

  1. [XSLT]Attribut optionnel ?
    Par kitma dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 20/10/2006, 12h30
  2. Réponses: 2
    Dernier message: 14/09/2006, 22h26
  3. [XSLT]Modification valeur element
    Par Henry23 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 27/06/2006, 16h36
  4. [XSD] Attribut ou élément
    Par be_tnt dans le forum Valider
    Réponses: 5
    Dernier message: 08/06/2006, 10h06
  5. [XSLT] Attribut dont le nom est stocké dans une variable ?
    Par Xfennec dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 15/03/2006, 11h20

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