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 :

Recopier un fichier XML en ajoutant un attribut sur une balise [XSLT 1.0]


Sujet :

XSL/XSLT/XPATH XML

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Par défaut Recopier un fichier XML en ajoutant un attribut sur une balise
    Bonjour,
    Je débute avec les feuilles de style et je bute sur un cas simple mais auquel je ne trouve pas de réponse.
    Je voudrais simplement recopier un fichier XML en ajoutant un attribut sur une balise si elle est rencontrée.
    Le code ci-dessous recopie le fichier jusqu'à ce qu'il rencontre la balise en question sur laquelle l'attribut est bien ajouté, mais ne copie pas la suite du fichier :

    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" version="1.0">
    	<xsl:output encoding="UTF-8" indent="yes" method="xml" version="1.0"/>
    	<xsl:param name="nomElement">Nom_Element</xsl:param>
    	<xsl:param name="nomTable">Nom_Table</xsl:param>
     
    	<xsl:template match="node() | @*">
    		<xsl:copy>
    			<xsl:choose>
    				<xsl:when test="name()=$nomElement"><xsl:attribute name="tableName"><xsl:value-of select="$nomTable"></xsl:value-of></xsl:attribute></xsl:when>
    				<xsl:otherwise>
    					<xsl:apply-templates select="@* | node()"/>
    				</xsl:otherwise>	
    			</xsl:choose>
    		</xsl:copy>
    	</xsl:template>
    </xsl:stylesheet>
    Merci de votre aide.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hum. Normalement "la suite" est bien recopiée comme tout le reste, c'est juste les enfants de la balise en question, qui disparaissent.
    C'est bien ça ?

    Si oui c'est normal puisque tu ne fais pas de apply-templates quand tu reconnais cette balise.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Le xsl:apply-templates devrait s'appliquer autant pour l'élément de nom désigné que pour les autres : par conséquence, il faut le mettre dehors de l'élément xsl:choose.
    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" version="1.0">
    	<xsl:output encoding="UTF-8" indent="yes" method="xml" version="1.0"/>
    	<xsl:param name="nomElement">Nom_Element</xsl:param>
    	<xsl:param name="nomTable">Nom_Table</xsl:param>
     
    	<xsl:template match="node() | @*">
    		<xsl:copy>
    			<xsl:choose>
    				<xsl:when test="name()=$nomElement"><xsl:attribute name="tableName"><xsl:value-of select="$nomTable"></xsl:value-of></xsl:attribute></xsl:when>
    				<xsl:otherwise>
    					<!--
    					<xsl:apply-templates select="@* | node()"/>
    					-->
    				</xsl:otherwise>	
    			</xsl:choose>
    			<!-- remettre ici -->
    			<xsl:apply-templates select="@* | node()"/>
    		</xsl:copy>
    	</xsl:template>
    </xsl:stylesheet>
    Pour xslt 1.0, c'est ce qu'on devrait faire. Pour xslt 2.0, il est un peu plus flexible sur l'attribut match de l'élément xsl:template, donc on peut préserver le template de la transformation d'identité et ajouter un template special mis à part pour l'élément de nom précisé dans le prédicat égale au paramètre $nomElement, une forme de construction qui n'est pas supportée officiellement dans xslt 1.0.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Par défaut
    Merci beaucoup pour votre aide : ça fonctionne
    Par contre, j'aurais mieux compris que les balises répondant au critère du when ne se copient pas et seulement celle de otherwise : alors que c'était l'inverse qui se passait.
    Merci pour votre éclairage..

  5. #5
    Membre Expert Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Par défaut
    Par contre, j'aurais mieux compris que les balises répondant au critère du when ne se copient pas et seulement celle de otherwise : alors que c'était l'inverse qui se passait.
    Si je comprends bien, c'est un autre problème qui consiste à éliminer completement les balises qui portent le nom de $nomElement. C'est bien de faire massager un peu le problème original pour mieux comprendre ce qui se passe dans le template. On peut le faire comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	<xsl:template match="node() | @*">
    		<xsl:choose>
    			<xsl:when test="name()=$nomElement" />
    			<xsl:otherwise>
    				<xsl:copy>
    					<xsl:apply-templates select="@* | node()"/>
    				</xsl:copy>	
    			</xsl:otherwise>	
    		</xsl:choose>
    	</xsl:template>
    Quand le critère de xsl:when se verifie, on ne fait rien; sinon, on copie... c'est ça qu'il dit.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 71
    Par défaut
    Merci

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

Discussions similaires

  1. [XPATH 1.0] Signature d'un fichier XML et ajout préfixe
    Par Invité dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 13/06/2014, 10h52
  2. [RegEx] fonction d'ajout d'attribut dans une balise html
    Par the magic developer dans le forum Langage
    Réponses: 4
    Dernier message: 30/10/2008, 12h48
  3. Réponses: 2
    Dernier message: 17/04/2008, 12h30
  4. écrire un fichier xml et ajout
    Par robert_trudel dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 09/06/2006, 14h23

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