xsl:strip-space + namespace - XML/XSL - Programmation
Marsh Posté le 11-12-2008 à 13:56:31
Re,
Bon, j'ai réussi à résoudre mon soucis avec un équivalent: j'utilise la fonction XPath normalize-space(), et cela me donne un résultat correct.
Voila :-)
Marsh Posté le 11-12-2008 à 14:13:35
thierry_b a écrit : Bonjour, Je m'apercois en fait que xsl:strip-space elements ne fonctionne pas quand on a un xml qui utilise un certain namespace. J'ai pourtant essayé ceci :
mais cela reste sans effet :-(. Une idée? |
L'idée, c'est qu'avant de poser ta question, tu ailles lire la doc.
Car si tu as obtenu ce que tu voulais avec XPath normalize-space, c'est que tu ne l'avais pas lue et que tu t'étais basé juste sur le nom "strip space"..
Car ce que fait XPath normalize-space (qui vire des blanc superflus dans du texte) n'a absolument rien a voir avec ce que fait xsl:strip-space (qui vire des éléments dont le contenu est du blanc généralisé (donc tab et rc aussi)).
A+,
Marsh Posté le 11-12-2008 à 14:20:33
Re,
euh nop, justement cete fonction xpath ne retire pas que les espaces (et ça m'arrange lol).
http://fr.selfhtml.org/xml/represe [...] lize_space
Résume plusieurs espaces au début ou à la fin d'une chaîne de caractères en un seul espace. Les espaces sont les signes avec les valeurs hexadécimales #x20 (espace simple), #x9 (tabulation), #xD (retour de chariot) ou #xA (avance d'une ligne).
Voila
Marsh Posté le 11-12-2008 à 14:25:06
Les espaces superflus, j'ai dit (le blanc généralisé en fait, je l'ai pas dit, mais dit au truc d'apres).
Il y a tout un tas de raisons liées au calcul de la mise en ligne pour cela.
Mais ce que je voulais surtout dire c'est que xsl:strip-space marchait, mais ne faisait pas ce que vous vous attendiez qu'elle fasse.
A+,
Marsh Posté le 11-12-2008 à 14:32:07
Ha oui ok.
Du coup par contre, si je veux pouvoir rajouter quelque chose autour de tous les éléments texte, par exemple des balises <TEXT></TEXT>, bah là, je suis obligé donc du coup, de pouvoir me servir de xsl:strip-space, sinon effectivement, j'ai des <TEXT></TEXT> dans mon xml résultant :-(
Une idée, pour résoudre ceci?
Merci :-)
Marsh Posté le 11-12-2008 à 14:34:01
D'ailleurs, la ou tu as pris ton info en français, c'est faux, ce qu'ils disent:
Citation : normalize-space() (retirer les espaces au début et à la fin d'une chaîne de caractères) |
il suffit de lire la doc officielle:
Citation : Function: string normalize-space(string?) |
Donc, ca:
1) vire les blancs generalisés aux deux extremités de la chaine
2) normalise a un blanc les suite de plusieurs blancs generalises
A+,
Marsh Posté le 11-12-2008 à 14:37:31
Citation : Du coup par contre, si je veux pouvoir rajouter quelque chose autour de tous les éléments texte, par exemple des balises <TEXT></TEXT> |
Pas tres clair ça.
Vous voulez transformer
<A>toto<B>tutu</B>titi</A>
en
<A><TEXT>toto</TEXT><B><TEXT>tutu</TEXT></B><TEXT>titi</TEXT></A>
??
Je suppose que c'est la maniere dont vous rajoutez avec xslt <TEXT>...</TEXT> qui pose probleme, car elle est appliquée sans verifier que le noeud n'a pas un contenu vide.
A+,
Marsh Posté le 11-12-2008 à 14:45:34
Re,
En fait, j'aimerais pour tous les noeuds texte de mon document XML, pouvoir les entourer d'une balise (là, l'essai est fait avec <TEXT> mais à fortioti ça sera plutot pour les transformer en CDATA), donc quelque chose de ce style:
Code :
|
sauf qu'effectivement avec ça, il le fait aussipour des noeud textes dont le contenu est du blanc généralisé vu que je me trouve avec des lignes
Code :
|
:-(.
Merci :-)
Marsh Posté le 11-12-2008 à 15:15:51
C'est ce que je te dis juste avant:
ton <xsl:template match="text()"> est trop général. Il faut verifier que ce n'est pas un noeud vide avant de faire ton
<xsl:element name="TEXT">
<xsl:value-of select="normalize-space()"/>
</xsl:element>
</xsl:template>
par exemple en utilisant not(string(.))
A+,
Marsh Posté le 11-12-2008 à 15:54:02
Re,
Bizarre car si je mets ca:
<xsl:template match="text()">
<xsl:if test="not(string(.))">
<xsl:element name="TEXT">
<xsl:value-of select="normalize-space()"/>
</xsl:element>
</xsl:if>
</xsl:template>
je ne vois plus aucun élémént texte dans mon xml résultant.
Si j'enlève le not, ca me donne toujours comme avant, j'ai des lignes <TEXT></TEXT>.
Et si enfin, je fais ceci :
<xsl:template match="text()">
<xsl:if test="normalize-space(.)">
<xsl:element name="TEXT">
<xsl:value-of select="normalize-space()"/>
</xsl:element>
</xsl:if>
</xsl:template>
Là ca marche nikel, j'ai <TEXT></TEXT> que sur mes noeuds texte non vide.
Une explication lol?
Merci :-)
Marsh Posté le 11-12-2008 à 16:13:15
J'avais en vue un
<xsl:template match="text()">
<xsl:choose>
<xsl:when test="not(string(.))">
</xsl:when>
<xsl:otherwise>
<xsl:element name="TEXT">
<xsl:value-of select="normalize-space()"/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Pour simuler un if then else, mais tu as trouvé mieux.
<xsl:if test="normalize-space(.)"> normalise-space(.) va retourner une chaine vide pour un noeud texte vide. c'est evalué avec boolean(), fonction qui rend 0 pour une chaine vide.
En fait, <xsl:if test="."> devrait faire la même chose ici (a tester).
A+,
Marsh Posté le 11-12-2008 à 16:29:02
Re,
Finalement, j'ai fait ça:
<xsl:template match="text()">
<xsl:choose>
<xsl:when test="normalize-space(.)">
<xsl:text disable-output-escaping="yes"><![CDATA[</xsl:text>
<xsl:value-of select="."/>
<xsl:text disable-output-escaping="yes">]]></xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Comme ca, dans le cas d'un noeud texte non vide, je l'englobe d'un CDATA et si c'est un noeud texte vide, je reprends quand même sa valeur pour garder mon indentation original :-)
Marsh Posté le 11-12-2008 à 13:35:55
Bonjour,
Je m'apercois en fait que xsl:strip-space elements ne fonctionne pas quand on a un xml qui utilise un certain namespace.
J'ai pourtant essayé ceci :
mais cela reste sans effet :-(.
Une idée?
PS: Voici l'entete présente dans mes fichiers XML :
Merci :-)