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] Supprimer les caractères spéciaux HTML d'un noeud texte


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Invité
    Invité(e)
    Par défaut [XSLT] Supprimer les caractères spéciaux HTML d'un noeud texte
    Bonjour tout le monde!
    J'ai un petit souci pour transformer du texte en XSLT.

    J'ai un texte qui contient des caractères spéciaux HTML du genre   é :
    2ème jour :
    Et je souhaiterais la transformer en texte simple du genre :
    2ème jour :
    Donc je voulais faire un template dans le style de ça :
    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
     
    <xsl:template name="despecialiseHTML">
    	<xsl:param name="text" />
     
    	<!-- Tableau des caractères spéciaux -->
    	<xsl:variable name="caracteres">
    		<car special="&amp;eacute;"><![CDATA[é]]></car>
    		<car special="&amp;nbsp;"><![CDATA[ ]]></car>
    		<car special="&amp;egrave;"><![CDATA[è]]></car>
    	</xsl:variable>
     
    	<xsl:for-each select="document('')//xsl:variable[@name='caracteres']/car">
    		<xsl:variable name="spe" select="@special" />
    		<xsl:variable name="normal" select="text()" />
    		<xsl:value-of select="translate($text, $spe, $normal)" />
    	</xsl:for-each>
    </xsl:template>
    où le paramètre text contient le texte à transformer. Dans l'idée, cela correspond à créer un tableau associatif qui pour un caractère spécial associe sa valeur normal. Puis je voulais boucler sur ce tableau pour chaque entrée appeler la fonction translate.
    Mais le souci est que la fonction translate remplace chaque caractère de $spe par $normal. Donc la fonction translate ne correspond pas à mon besoin.

    Est-ce que quelqu'un aurait une idée pour m'aider à avancer ?

    merci beaucoup!

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 83
    Points : 100
    Points
    100
    Par défaut
    Bonsoir,

    La vraie question qu'il faut te poser, c'est pourquoi on a créer des entités pour certains caractères ... et ce que sont les entités.

    Ton problème je pense vient de la démarche, l'intérêt n'est pas de créer
    une fonction qui décode les entités dans le XSL, si c'est possible ... C'est de lister tes entités dans une DTD et d'utiliser une option du type substituteEntities lors de la transformation, pour que tes entités sont remplacées dans leur valeur réelle en sortie.

    Pour finir, si ta transformation est pour du web, le fait d'utiliser des entités rentre parfaitement dans le principe d'échapper de manière appropriée des données avant de les envoyer à un programme tiers( ici ton navigateur web ).

    Sinon, si les histoires de DTD et d'entités t'ennuie, il suffit de remplacer les entités au niveau applicatif ( c'est la version vite et sale ).

    Par exemple en php :

    echo html_entity_decode( $xslt->transformToXML($xml) ) ;



    Cordialement,

    Xavier

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour vexa!
    Je te remercie pour ta réponse. Je t'avouerais que je ne connais pas très bien XML/XSL et du coup, je n'ai pas pensé au DTD. Je vais me renseigner voir ce que c'est et voir si ça peut convenir.
    En fait, je ne peut pas changer la sortie au niveau applicatif puisque à certain, moment, j'ai besoin de cette sortie HTML. Et ma sortie n'est pas pour du web mais dans un simple fichier txt...
    En fait, je n'ai pas franchement accès au côté applicatif et à la création du XML. Du coup, je dois faire avec le XML que je reçois.

    Edit : La solution de la DTD ne peut pas convenir à mon souci vu qu'il s'agit d'une modification du fichier XML. Et je ne peux pas modifier le XML... Quelqu'un aurait une autre piste ?
    Dernière modification par Invité ; 18/12/2008 à 09h58.

  4. #4
    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,
    Citation Envoyé par vexa Voir le message
    Ton problème je pense vient de la démarche, l'intérêt n'est pas de créer une fonction qui décode les entités dans le XSL, si c'est possible ... C'est de lister tes entités dans une DTD et d'utiliser une option du type substituteEntities lors de la transformation, pour que tes entités sont remplacées dans leur valeur réelle en sortie.
    Si les données du problème sont correctement exposées, cette DTD existe forcément et est déjà déclarée dans le document source (ou signalée au parseur par code), sinon le parseur XML considérerait le fichier comme mal formé et renverrait une erreur ; en effet, les seuls entités reconnues par défaut par la norme XML sont &lt;, &gt;, &apos;, &quote; et &amp;. Toute autre entité, y compris celles définies par (X)HTML doit faire l'objet d'une déclaration d'entité dans une DTD.

    Il va falloir que tu nous en dises un petit peu plus sur ton document source.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Voilà l'extrait du fichier XML source qui pose problème :

    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' ?>
    <produit>
      ... blabla qui nous intéresse pas ...
      <edition>
        ... blabla qui nous intéresse pas ...
        <traduction id_traduction="1">
          <blocs type="bloc_text">
            <bloc_text id_produit_categorie_bloc="10">
              <contenu>
                <![CDATA[<p>&nbsp;</p>
                <h3 style="font-weight: bold;"><b>2&egrave;me jour&nbsp;: AMSTERDAM</b></h3> blablabla ]]>
              </contenu>
            </bloc_text>
            ... blabla qui nous intéresse pas ...
          </blocs>
        </traduction>
        ... blabla qui nous intéresse pas ...
      </edition>
    </produit>
    Voilà, j'espère que ça pourra aider...

  6. #6
    Invité
    Invité(e)
    Par défaut
    Pour ceux que ça pourrait intéresser, je vous donne le code que j'ai enfin réussi à pondre :
    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
     
    <xsl:template name="despecialiseHTML">
    	<xsl:param name="text" />
    	<xsl:param name="id_caracteres" select="1" />
     
    	<!-- Tableau des caractères spéciaux -->
    	<xsl:variable name="caracteres">
    		<car id="1">
    			<special><![CDATA[&eacute;]]></special>
    			<normal><![CDATA[é]]></normal>
    		</car>
    		<car id="2">
    			<special><![CDATA[&nbsp;]]></special>
    			<normal><![CDATA[ ]]></normal>
    		</car>
    		<car id="3">
    			<special><![CDATA[&egrave;]]></special>
    			<normal><![CDATA[è]]></normal>
    		</car>
    		etc...
    	</xsl:variable>
     
    	<xsl:variable name="car_special" select="document('')//xsl:variable[@name='caracteres']/car[@id=$id_caracteres]/special" />
    	<xsl:variable name="car_normal" select="document('')//xsl:variable[@name='caracteres']/car[@id=$id_caracteres]/normal" />
     
    	<xsl:choose>
    		<xsl:when test="$id_caracteres &gt; count(document('')//xsl:variable[@name='caracteres']/car)">
    			<xsl:value-of select="$text" />
    		</xsl:when>
    		<xsl:when test="contains($text, $car_special)">
    			<xsl:call-template name="despecialiseHTML">
    				<xsl:with-param name="text" select="concat(substring-before($text, $car_special), $car_normal, substring-after($text, $car_special))" />
    				<xsl:with-param name="id_caracteres" select="$id_caracteres" />
    			</xsl:call-template>
    		</xsl:when>
    		<xsl:otherwise>
    			<xsl:call-template name="despecialiseHTML">
    				<xsl:with-param name="text" select="$text" />
    				<xsl:with-param name="id_caracteres" select="$id_caracteres+1" />
    			</xsl:call-template>
    		</xsl:otherwise>
    	</xsl:choose>
    </xsl:template>
    Merci à vexa et GrandFather!

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 83
    Points : 100
    Points
    100
    Par défaut oups
    Bonsoir,

    Toute autre entité, y compris celles définies par (X)HTML doit faire l'objet d'une déclaration d'entité dans une DTD.
    Cependant, si on met les entités dans des sections non analysées, elles n'ont pas à être déclarées ... , comme quoi j'étais pas loin de la bonne réponse...

    En dehors de cette petite boutade, c'est vrai que je m'emballe un peu vite des fois et je lirais mieux le problème avant de poster dessus.

    Promis je referrais pas ...

    Xavier

Discussions similaires

  1. [XL-2007] Supprimer les caractères spéciaux
    Par Yolak dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 17/01/2017, 15h56
  2. Supprimer les caractères spéciaux
    Par sami_c dans le forum Langage
    Réponses: 4
    Dernier message: 09/09/2008, 13h12
  3. Supprimer les caractères spéciaux
    Par snopims dans le forum C#
    Réponses: 8
    Dernier message: 08/08/2008, 15h33
  4. [Jsp] Supprimer les caractère spéciaux d'une chaine
    Par PeteMitchell dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 13/05/2004, 11h11

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