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 :

CDATA, xsl et xml


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 29
    Points : 16
    Points
    16
    Par défaut CDATA, xsl et xml
    Bonjour,
    Je souhaite insérer un bloc de balises XML dans le champ d'une table. Mais pour insérer mes données je passe par un fichier XML (XSU) qui a été interprété par un XSL.
    Exemple :
    mon fichier XML d'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <INSERT>
    <BALISE1>valeur1</BALISE1>
    <BALISE2>valeur2</BALISE2>
    </INSERT>
    Ce que je dois retrouver dans ma base de données :
    <BALISE1>valeur1</BALISE1>
    <BALISE2>valeur2</BALISE2>

    Quel tête doit avoir mon fichier XSL pour avoir un XML valide?
    le but serait de transformer mon xml en qqch comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <INSERT><![CDATA[
    <BALISE1>valeur1</BALISE1>
    <BALISE2>valeur2</BALISE2>
    ]]></INSERT>
    mais comme mon XSL ressemble à ça à l'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <COLONNE1><xsl:value-of select="INSERT"/></COLONNE1>
    quand je rajoute CDATA dans le xsl, il me met texto dans ma base :
    <xsl:value-of select="INSERT"/>

    argh!

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 304
    Points : 15 631
    Points
    15 631
    Par défaut
    voila ce qu'il te faut
    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 version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     
    	<xsl:template match="/">
    		<COLONNE1>
    			<xsl:apply-templates select="INSERT"/>
    		</COLONNE1>
    	</xsl:template>
     
    	<xsl:template match="INSERT">
    			<xsl:apply-templates/>
    	</xsl:template>
     
       <xsl:template match="@*|*"> 
          <xsl:copy> 
             <xsl:apply-templates select="@*|node()"/> 
          </xsl:copy> 
       </xsl:template> 
     
    </xsl:stylesheet>
    par contre je garantis pas qu'il y aie des effets secondaire comme je l'ai dit ici :
    http://www.developpez.net/forums/vie...=567100#567100

    je dit ca parce que j'ai recupére la boucle "match="@*|*"" et je n'ai pas compris ce qu'elle fait en details a part recopier les balises

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 29
    Points : 16
    Points
    16
    Par défaut euh?
    j'ai testé (peut-être mal?) et je n'ai rien obtenu sinon que mon xml après transformation a cette tête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <COLONNE1>
    <BALISE1>valeur1</BALISE1>
    <BALISE2>valeur2</BALISE2>
    </COLONNE1>
    alors que c'est pas exactement ce que je veux : ça n'est pas lisible par XSU! COLONNE1 reste vide.
    Alors que l'idéal serait d'avoir après transformation xsl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <COLONNE1>
    <balise pour ne pas prendre la suite comme du xml>
    <BALISE1>valeur1</BALISE1>
    <BALISE2>valeur2</BALISE2>
    </balise pour ne pas prendre la suite comme du xml>
    </COLONNE1>

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 29
    Points : 16
    Points
    16
    Par défaut en bref,...
    est-ce qu'il y aurrait une possiblité d'insérer <![CDATA[ ou autre balise dans le XML sans qu'il soit interprété par le XSL?

  5. #5
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 304
    Points : 15 631
    Points
    15 631
    Par défaut
    il faudrait que tu insères directement "<![CDATA[...]]>" dans ton xml de départ

    ou alors tu remplace les "<" par "&lt;" , "&" par "&amp;" et "]]>" par "]]&lt;" dans le contenu des balises "COLONNE"

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 29
    Points : 16
    Points
    16
    Par défaut ...
    pour le premier cas c'est pas possible parce que ce n'est pas moi qui génère le fichier XML de départ.

    Pour la balise CDATA transformée avec des &lt! j'ai encore un soucis, je me retrouve avec un xml comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <COLONNE1>
    &lt;![CDATA[
    <BALISE1>valeur1</BALISE1>
    <BALISE2> valeur2</BALISE2>
    ]]&gt;
    </COLONNE1>
    Au lieu d'un XML comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <COLONNE1>
    <![CDATA[
    <BALISE1>valeur1</BALISE1>
    <BALISE2> valeur2</BALISE2>
    ]]>
    </COLONNE1>

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 29
    Points : 16
    Points
    16
    Par défaut oups
    j'ai mal lu la réponse!
    c'est dans le contenu des balises colonne et pas dans les CDATA qu'il faut utiliser les &lt;

    dans ce cas je dois recopier entièrement la structure du XML que je veux intégrer dans la base. Ou alors il existe une super fonction xsl qui fait tout le boulot sans connaître exactement ce qu'il y a à l'intérieur?

  8. #8
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut
    Citation Envoyé par mathix
    je dit ca parce que j'ai recupére la boucle "match="@*|*"" et je n'ai pas compris ce qu'elle fait en details a part recopier les balises
    Ca ajoute le namespace XSL (pour certaines balises comme <div>). Pour éviter ça, il faut utiliser :
    <xsl:template match="@*">
    <xsl:copy />
    </xsl:template>

    <xsl:template match="*">
    <xsl:element name="{name()}" >
    <xsl:apply-templates select="* | text() | @*"/>
    </xsl:element>
    </xsl:template>
    "@*" : copie les attributs
    "*" : copie les balises

    J'utilisais le code que tu proposais, mathix, mais j'ai eu des problèmes à la validation W3C.org de mes pages web.

    @+ Haypo

  9. #9
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 304
    Points : 15 631
    Points
    15 631
    Par défaut
    et voila le code que tu veux petitelulu avec en prime les templates de recopie de haypo
    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
    <?xml version="1.0" encoding="iso-8859-1"?> 
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
     
       <xsl:output 
          method="xml" 
          version="1.0" 
          encoding="iso-8859-1"
          omit-xml-declaration="no" 
          indent="yes"    
       /> 
     
       <xsl:template match="/"> 
          <xsl:apply-templates/> 
       </xsl:template> 
     
       <xsl:template match="INSERT">
       <COLONNE1>
    <xsl:text disable-output-escaping="yes">
    &lt;![CDATA[
    </xsl:text>
          <xsl:apply-templates/> 
    <xsl:text disable-output-escaping="yes">
    ]]&gt;
    </xsl:text>  
       </COLONNE1>
       </xsl:template> 
     
    	<!--xsl:template match="//INSERT/descendant::*" priority="+1"--> 
    	<xsl:template match="*"> 
    		<xsl:element name="{name()}" > 
    			<xsl:apply-templates select="* | text() | @*"/> 
    		</xsl:element> 
    	</xsl:template> 
     
       <xsl:template match="@*"> 
          <xsl:copy /> 
       </xsl:template> 
     
    </xsl:stylesheet>
    le probleme c'est que tu en doit pas avoir de template qui match des balises qui sont dans tes balises 'insert' sinon elle risque de ne pas passer par la recopie
    c'est pour ca que j'ai voulu mettre la ligne qui est en commentaire mais ca me fait une erreur "Illegal axis in pattern"

  10. #10
    Membre émérite

    Homme Profil pro
    Urbaniste
    Inscrit en
    Mars 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Mars 2002
    Messages : 255
    Points : 2 717
    Points
    2 717
    Par défaut
    Citation Envoyé par haypo
    Citation Envoyé par mathix
    je dit ca parce que j'ai recupére la boucle "match="@*|*"" et je n'ai pas compris ce qu'elle fait en details a part recopier les balises
    Ca ajoute le namespace XSL (pour certaines balises comme <div>). Pour éviter ça, il faut utiliser : (code ...).
    Pour ceux qui n'ont pas capté, avec la version de mathix (version la plus répendue, malheureusement) du code de recopiage des données, on obtient ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        <div class="centre">
          <div xmlns:xsl="http://www.w3.org/1999/XSL/Transform" class="sousmenu">
       ...
    Le namespace XSL est recopié ... mais pas tout le temps. Voilà où est la problème.

    Le post dans lequel j'ai résolu mon problème :
    http://www.developpez.net/forums/viewtopic.php?t=96239

    @+ Haypo

  11. #11
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 304
    Points : 15 631
    Points
    15 631
    Par défaut
    et voila la nouvelle version (aprés j'arrete le developpement )
    améliorations :
    - seul le contenu des balises "INSERT" est recopié, les balises en dehors gardent leur comportement normal
    - si un template existe deja pour une balise qui est dans "INSERT", le template n'est pas appliqué, la balise est recopiée

    et le 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <?xml version="1.0" encoding="iso-8859-1"?> 
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
     
       <xsl:output 
          method="xml" 
          version="1.0" 
          encoding="iso-8859-1"
          omit-xml-declaration="no" 
          indent="yes"    
       /> 
     
       <xsl:template match="/"> 
          <xsl:apply-templates/> 
       </xsl:template> 
     
       <xsl:template match="INSERT">
       <COLONNE1>
       <xsl:text disable-output-escaping="yes">
    &lt;![CDATA[
    </xsl:text>
          <xsl:apply-templates mode="recopie"/> 
       <xsl:text disable-output-escaping="yes">
    ]]&gt;
    </xsl:text>  
       </COLONNE1>
       </xsl:template> 
     
    	<xsl:template match="*" mode="recopie"> 
    		<xsl:element name="{name()}" > 
    			<xsl:apply-templates select="*|text()|@*" mode="recopie"/> 
    		</xsl:element> 
    	</xsl:template> 
     
       <xsl:template match="@*" mode="recopie"> 
          <xsl:copy/> 
       </xsl:template>
     
    </xsl:stylesheet>

Discussions similaires

  1. Problème CDATA dans balise XML
    Par charliejo dans le forum Dynamique
    Réponses: 4
    Dernier message: 12/01/2007, 12h04
  2. lier XSL et XML en local
    Par closo dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 01/09/2005, 15h02
  3. [XSL-FO] xml vers xsl-fo (pour generation PDF ou RTF)
    Par dams50 dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 13/12/2003, 21h07
  4. Questionnaire à réaliser avec XSL et XML
    Par olive.m dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 19/11/2003, 16h37
  5. generer xsl depuis xml avec balises inconues ?
    Par cedre dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 24/06/2003, 09h00

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