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] CDATA par défaut lors d'une transformation xsl


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2005
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 188
    Par défaut [XSLT] CDATA par défaut lors d'une transformation xsl
    Bonjour,

    Lors d'un précédent post, j'ai réussi à lui spécifier lors d'une transformation xsl, les éléments pour lesquels je souhatais pouvoir conserver mon bloc CDATA.

    J'aimerais en fait lors de ma transformation, pour chaque noeud texte rencontré (qu'il y ait ou pas un CDATA), le retourner dans mon xml résultant avec un CDATA.

    Quelqu'un pourrait t'il me dire comment je peux faire cela facilement dans ma feuille xsl?

    Sachant que pour l'instant, j'utilise ce bout de code là, pour les noeuds xml, que je veux recopier (sans modifier) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     <xsl:template match="node() | @*">
    	<xsl:copy>
    		<xsl:apply-templates select="node() | @*"/>
    	</xsl:copy>
    </xsl:template>
    Merci :-)

  2. #2
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

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

    l'attribut cdata-section-elements accepte le caractère joker * pour désigner tous les éléments du document de sortie (qui comprennent du texte).
    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
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Par défaut
    Pour un exemple de ce que dit grandfather regarde la FAQ
    http://xml.developpez.com/faq/?page=3#xslt_cdata

    PS:pense à mettre un tag dans ton titre

  4. #4
    Membre éclairé
    Inscrit en
    Novembre 2005
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 188
    Par défaut re
    Re,

    Si j'utilise cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <xsl:output 
      method="xml"
      encoding="UTF-8"
      indent="yes"
      cdata-section-elements="*"
    />
    Il me met cete erreur lors de ma transformation xsl :

    ERREUR : 'file:///C:/xxxx/xxxx/xslStyleSheet: line 11: An attribute whose value must be a QName or whitespace-separated list of QNames had the value '*''.

    Sinon, j'ai voulu essayer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <xsl:template match="text()">
    	<xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>	
    	<xsl:value-of select="."/>
    	<xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
    </xsl:template>
     
     <!-- On traite l'élément / attribut courant -->
     <xsl:template match="node() | @*">
    	<xsl:copy>
    		<xsl:apply-templates select="node() | @*"/>
    	</xsl:copy>
    </xsl:template>
    Mais cela ne marche pas bien, il me rajoute des CDATA en plus de ceux existants (par exemple entre deux balises...).

    Merci :-)

  5. #5
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Argh, désolé, je me suis gouré : cdata-section-elements ne supporte pas *, j'ai confondu avec strip-space et preserve-space...

    Cet attribut supporte une liste de noms d'éléments séparés par un espace, mais si tu ne les connais pas à l'avance ça va pas le faire...

    Juste pour comprendre : quelle est la nécessité de placer des CDATA partout ?
    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

  6. #6
    Membre éclairé
    Inscrit en
    Novembre 2005
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 188
    Par défaut re
    Re,

    C'est juste que dans mon xml d'origine (ce n'est pas moi qui décide de son contenu), j'en ai pour tous les éléments texte et que donc j'aimerais les conserver.

    Je pense que cela a été fait pour éviter que ces contenus soient interprétés et que donc on puisse mettre n'importe quel caractère dedans.

    Voila :-)

  7. #7
    Membre éclairé
    Inscrit en
    Novembre 2005
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 188
    Par défaut Re
    Re,

    Finalement j'ai utilisé ceci (pour garder les CDATA et en prenant en compte le fait que je pouvais pas me servir de la fonction XSL xsl:strip-space) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <xsl:template match="text()">
    	<xsl:choose>
    		<xsl:when test="normalize-space(.)">
    			<xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>	
    			<xsl:value-of select="."/>
    			<xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
    		</xsl:when>
    		<xsl:otherwise>
    			<xsl:value-of select="."/>
    		</xsl:otherwise>
    	</xsl:choose>
    </xsl:template>
    Pour chaque noeud de type texte rencontré, on regarde si c'est un élément non vide:
    - si c'est le cas, on le recopie en l'englobant d'un CDATA
    - sinon, on se contente de le recopier.

    Voila :-)

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/05/2011, 00h40
  2. Valeur par défaut lors d'une requête SELECT
    Par LordVoid dans le forum Débuter
    Réponses: 5
    Dernier message: 09/08/2010, 12h00
  3. Réponses: 3
    Dernier message: 05/06/2010, 11h13
  4. Encodage lors d'une transformation xsl par le browser
    Par ouioui2000 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 14/04/2006, 12h09

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