xsl:strip-space + namespace

xsl:strip-space + namespace - XML/XSL - Programmation

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 :
 

Code :
  1. <xsl:strip-space elements="xmlns:* xmlns:xi:* xmlns:xsi:* xsi:type:* *"/>


 
mais cela reste sans effet :-(.
 
Une idée?
 
PS: Voici l'entete présente dans mes fichiers XML :
 

Code :
  1. <Transaction Status="Success" TimeStamp="2008-02-25T03:19:23" Version="1.1" xmlns="http://www.exchangefortravel.org/xft/current" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.exchangefortravel.org/xft/current http://www.exchangefortravel.org/x [...] .xsd&#034; xsi:type="TransactionResponseType">


 
Merci :-)

Reply

Marsh Posté le 11-12-2008 à 13:35:55   

Reply

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 :-)

Reply

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 :

 
Code :
  1. <xsl:strip-space elements="xmlns:* xmlns:xi:* xmlns:xsi:* xsi:type:* *"/>
 

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+,


Message édité par gilou le 11-12-2008 à 14:14:28

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

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 :)

Reply

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+,


Message édité par gilou le 11-12-2008 à 14:26:42

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

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 :-)

Reply

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)
 
Résume plusieurs espaces au début ou à la fin d'une chaîne de caractères en un seul espace.


il suffit de lire la doc officielle:

Citation :

Function: string normalize-space(string?)
 
The normalize-space function returns the argument string with whitespace normalized by stripping leading and trailing whitespace and replacing sequences of whitespace characters by a single space. Whitespace characters are the same as those allowed by the S production in XML. If the argument is omitted, it defaults to the context node converted to a string, in other words the string-value of the context node.

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+,


Message édité par gilou le 11-12-2008 à 14:38:56

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

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+,


Message édité par gilou le 11-12-2008 à 14:44:34

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

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 :
  1. <xsl:template match="text()">
  2. <xsl:element name="TEXT">
  3.  <xsl:value-of select="normalize-space()"/>
  4. </xsl:element>
  5. </xsl:template>


 
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 :
  1. <TEXT></TEXT>

:-(.
 
Merci :-)


Message édité par thierry_b le 11-12-2008 à 14:46:02
Reply

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+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 11-12-2008 à 15:15:51   

Reply

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 :-)
 

Reply

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+,


Message édité par gilou le 11-12-2008 à 16:13:41

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

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">&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>
 
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 :-)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed