Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
826 connectés 

  FORUM HardWare.fr
  Programmation
  XML/XSL

  xsl:strip-space + namespace

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

xsl:strip-space + namespace

n°1825457
thierry_b
Posté le 11-12-2008 à 13:35:55  profilanswer
 

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

mood
Publicité
Posté le 11-12-2008 à 13:35:55  profilanswer
 

n°1825476
thierry_b
Posté le 11-12-2008 à 13:56:31  profilanswer
 

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

n°1825496
gilou
Modérateur
Modzilla
Posté le 11-12-2008 à 14:13:35  profilanswer
 

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é!  --
n°1825506
thierry_b
Posté le 11-12-2008 à 14:20:33  profilanswer
 

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

n°1825511
gilou
Modérateur
Modzilla
Posté le 11-12-2008 à 14:25:06  profilanswer
 

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é!  --
n°1825516
thierry_b
Posté le 11-12-2008 à 14:32:07  profilanswer
 

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

n°1825518
gilou
Modérateur
Modzilla
Posté le 11-12-2008 à 14:34:01  profilanswer
 

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é!  --
n°1825526
gilou
Modérateur
Modzilla
Posté le 11-12-2008 à 14:37:31  profilanswer
 

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é!  --
n°1825531
thierry_b
Posté le 11-12-2008 à 14:45:34  profilanswer
 

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
n°1825555
gilou
Modérateur
Modzilla
Posté le 11-12-2008 à 15:15:51  profilanswer
 

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é!  --
mood
Publicité
Posté le 11-12-2008 à 15:15:51  profilanswer
 

n°1825587
thierry_b
Posté le 11-12-2008 à 15:54:02  profilanswer
 

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

n°1825597
gilou
Modérateur
Modzilla
Posté le 11-12-2008 à 16:13:15  profilanswer
 

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é!  --
n°1825610
thierry_b
Posté le 11-12-2008 à 16:29:02  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  XML/XSL

  xsl:strip-space + namespace

 

Sujets relatifs
[Résolu] Paramétrer le "Java heap space" sur TomcatNamespace, PO et Visual C++
anti-aliasing triangle stripanti-aliasing triangle strip
Formattage du texte en CSS avec white-spaceJDOM: problème de namespace
Redefinition de namespaceQuestion à la con : parcourir un namespace...
the type or namespace 'Office' does not exists in 'Microsoft'Changer la taille du heap space de JVM
Plus de sujets relatifs à : xsl:strip-space + namespace


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR