Insertion de caractère dans un nom de mes champs XML

Insertion de caractère dans un nom de mes champs XML - XML/XSL - Programmation

Marsh Posté le 27-06-2012 à 15:11:20    

Bonjour,
 
J'ai un fichier XML construit comme ceci :
 
 
 

Code :
  1. <toto ID="Bonjour-LaLA-LILO">
  2.     <Title>Oui</Title>
  3.   </toto>


 
Et je voudrai faire un template en XSLT, qui à chaque fois que je l'appelle, il me mette un "\" devant chaque tiret. En effet, ces tirets ne passent pas dans ma base données que je crée par la suite!!
 
Une idée ?

Reply

Marsh Posté le 27-06-2012 à 15:11:20   

Reply

Marsh Posté le 27-06-2012 à 21:34:40    

[:google] http://geekswithblogs.net/Erik/arc [...] 20915.aspx
A+,


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

Marsh Posté le 28-06-2012 à 10:01:44    

Code :
  1. <xsl:template name="string-replace-all">
  2.     <xsl:param name="text" />
  3.     <xsl:param name="replace" />
  4.     <xsl:param name="by" />
  5.     <xsl:choose>
  6.       <xsl:when test="contains($text, $replace)">
  7.         <xsl:value-of select="substring-before($text,$replace)" />
  8.         <xsl:value-of select="$by" />
  9.         <xsl:call-template name="string-replace-all">
  10.           <xsl:with-param name="text"
  11.           select="substring-after($text,$replace)" />
  12.           <xsl:with-param name="replace" select="$replace" />
  13.           <xsl:with-param name="by" select="$by" />
  14.         </xsl:call-template>
  15.       </xsl:when>
  16.       <xsl:otherwise>
  17.         <xsl:value-of select="$text" />
  18.       </xsl:otherwise>
  19.     </xsl:choose>
  20.   </xsl:template>


 
Voici ceux qu'ils donnent okay. Donc à la place de "by" "replace" et "text", je dois mettre mes vrais caractères à moi ?
Quelle est la différence entre $by et by ?
 
Merci de votre aide

Reply

Marsh Posté le 28-06-2012 à 11:11:30    

Citation :

Voici ceux qu'ils donnent okay. Donc à la place de "by" "replace" et "text", je dois mettre mes vrais caractères à moi ?

non. C'est pas le template qu'il faut modifier, c'est son appel avec un xsl:call-template ou vous passerez les bonnes valeurs aux paramètres.

Citation :

Quelle est la différence entre $by et by ?

Manifestement, il faudrait d'abord apprendre d'abord un peu le XSLT avant de vouloir l'utiliser, parce que poser une question aussi basique montre que vous ne possédez pas les bases.
 
A+,


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

Marsh Posté le 28-06-2012 à 12:50:30    

<xsl:param name="text" />
<xsl:param name="replace" />
<xsl:param name="by" />
 
Ca définit les paramètres du template (ici = fonction) nommé string-replace-all. En gros, c'est pareil que dans un langage de programmation tu définis une fonction avec ses paramètres. Donc là, on nomme les paramètre. Dans la suite du code xsl, $by indique qu'on utilise la variable (donc le contenu) nommée "by".


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-06-2012 à 15:06:10    

Etant donné que je ne comprend pas le code que je vous ai filé.
J'ai essayé de remplacer via mon script Php, qui lui, exploite le XML et XSLT.
 
Cependant, il m'ajoute plusieurs "\" avant mes tirets, mais le soucis c'est que ça fausse mes clauses "where".
 
si je remplace "a-elle" dans ma creation par "a\-elle",
Et que par la suite je fais : where table='a\-elle'
Cela ne fonctionnera pas, car dans ma base SOURCE, je ne modifie par les avant tirets...

Reply

Marsh Posté le 28-06-2012 à 15:07:08    

Et pour faire ce tu voulais juste sur les valeurs d'attribut (pas clair si c'était désiré ailleurs), ceci convient à priori:

Code :
  1. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  2.  <xsl:output omit-xml-declaration="yes" indent="no"/>
  3.  <!-- definition de la fonction de remplacement -->
  4.  <xsl:template name="string-replace-all">
  5.    <xsl:param name="text" />
  6.    <xsl:param name="replace" />
  7.    <xsl:param name="by" />
  8.    <xsl:choose>
  9.      <xsl:when test="contains($text, $replace)">
  10.        <xsl:value-of select="substring-before($text,$replace)" />
  11.        <xsl:value-of select="$by" />
  12.        <xsl:call-template name="string-replace-all">
  13.          <xsl:with-param name="text"
  14.          select="substring-after($text,$replace)" />
  15.          <xsl:with-param name="replace" select="$replace" />
  16.          <xsl:with-param name="by" select="$by" />
  17.        </xsl:call-template>
  18.      </xsl:when>
  19.      <xsl:otherwise>
  20.        <xsl:value-of select="$text" />
  21.      </xsl:otherwise>
  22.    </xsl:choose>
  23.  </xsl:template>
  24.  <!-- copie des noeuds en sortie -->                                                    
  25.  <xsl:template match="node()">
  26.    <xsl:copy>
  27.      <!-- appel récursif avec aussi traitement des attributs -->
  28.      <xsl:apply-templates select="node()|@*"/>
  29.    </xsl:copy>
  30.  </xsl:template>
  31.  <!-- appel à la fonction pour modifier les valeurs des attributs -->  
  32.  <xsl:template match="@*">
  33.    <xsl:attribute name="{name(.)}">
  34.      <xsl:call-template name="string-replace-all">
  35.      <xsl:with-param name="text" select="." />
  36.      <xsl:with-param name="replace" select="'-'" />
  37.      <xsl:with-param name="by" select="'\-'" />
  38.      </xsl:call-template>
  39.    </xsl:attribute>
  40.  </xsl:template>
  41. </xsl:stylesheet>


 
Testé avec Saxon sur ce fichier test:

<toto ID="Bonjour-LaLA-LILO">
<Title att1="-a--a-" att2="b---b">Oui</Title>
  <!-- comment -->
      <?pi1 proc instruction ?>
</toto>


ça donne en sortie:

<toto ID="Bonjour\-LaLA\-LILO">
   <Title att1="\-a\-\-a\-" att2="b\-\-\-b">Oui</Title>
  <!-- comment -->
      <?pi1 proc instruction ?>
</toto>


 
A+,


Message édité par gilou le 28-06-2012 à 15:21:26

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

Marsh Posté le 28-06-2012 à 15:35:07    

Je vous remercie pour cette précieuse aide. Mais je n'arrive pas à la fonctionner.
 
Mon fichier XSLT se présente ainsi :  

Code :
  1. <xsl:template match="champ[@genre='liste']">
  2.       `<xsl:value-of select="@id"/>` ID
  3.     </xsl:template>
  4.   <xsl:template match="champ[ @genre='numerique']">
  5.        `<xsl:value-of select="@id"/>` ID
  6.     </xsl:template>


 
Et c'est le @id de chaque CHAMP que je veux modifier, comment faire

Reply

Marsh Posté le 28-06-2012 à 15:52:49    

Il suffit de transposer bêtement l'appel au template

Code :
  1. <xsl:template match="champ[@genre='liste']">
  2.       `<xsl:call-template name="string-replace-all">
  3.       <xsl:with-param name="text" select="@id" />
  4.       <xsl:with-param name="replace" select="'-'" />
  5.       <xsl:with-param name="by" select="'\-'" />
  6.       </xsl:call-template>` ID
  7. </xsl:template>
  8. <xsl:template match="champ[@genre='numerique']">
  9.       `<xsl:call-template name="string-replace-all">
  10.       <xsl:with-param name="text" select="@id" />
  11.       <xsl:with-param name="replace" select="'-'" />
  12.       <xsl:with-param name="by" select="'\-'" />
  13.       </xsl:call-template>` ID
  14. </xsl:template>


A+,


Message édité par gilou le 28-06-2012 à 15:53:59

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

Marsh Posté le 12-07-2012 à 16:07:28    

Wahouuu !!!! Merci beaucoup Gillou !!!
 
Mais j'ai essayais ça, pour échapper les quotes :  
 

Code :
  1. <xsl:call-template name="string-replace-all">          <xsl:with-param name="text" select="@id" />          <xsl:with-param name="replace" select=" ' &quot; '" />          <xsl:with-param name="by" select="' \&quot; '" />          </xsl:call-template>"


 
 
Cependant, ça ne marche pas, il me laisse les quotes , est ce normal ?


Message édité par Ellia le 12-07-2012 à 16:08:33
Reply

Marsh Posté le 12-07-2012 à 16:07:28   

Reply

Marsh Posté le 12-07-2012 à 20:34:11    

Ceci devrait faire l'affaire:

Code :
  1. <!-- match de tous les noeud texte non vides, a adapter selon tes besoins -->
  2.   <xsl:template match="text()[not(normalize-space() = '')]">
  3.     <xsl:call-template name="escape-apos">
  4.       <xsl:with-param name="string" select="."/>
  5.     </xsl:call-template>
  6.   </xsl:template>
  7.   <xsl:template name="escape-apos">
  8.   <xsl:param name="string"/>
  9.   <xsl:variable name="apos">&apos;</xsl:variable>
  10.   <xsl:choose>
  11.     <!-- pas d'apostrophe => sortie du texte non modifie -->
  12.     <xsl:when test="not(contains($string, $apos))">
  13.       <xsl:value-of select="$string"/>
  14.     </xsl:when>
  15.     <xsl:otherwise>
  16.       <!-- apostrophe => sortie du texte avant non modifie -->
  17.       <xsl:value-of select="substring-before($string, $apos)"/>
  18.       <!-- puis de l'apostrophe echappee avec \ -->
  19.       <xsl:text>\&apos;</xsl:text>
  20.       <!-- puis appel recursif pour traiter le texte qui suit l'apostrophe -->
  21.       <xsl:call-template name="escape-apos">
  22.         <xsl:with-param name="string" select="substring-after($string, $apos)"/>
  23.       </xsl:call-template>
  24.     </xsl:otherwise>
  25.   </xsl:choose>
  26. </xsl:template>


 
En principe, c'est 'tail-recursive', donc optimisé par un bon compilo XSLT.
A+,


Message édité par gilou le 12-07-2012 à 21:33:51

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

Marsh Posté le 13-07-2012 à 10:12:02    

Merci, mais comment faire pour appeler ma fonction au sein de mon code :  
 
est ce comme ceci ?
 

Code :
  1. <xsl:call-template name="string-replace-all">
  2.          <xsl:with-param name="text" select="@id" />
  3.          <xsl:with-param name="replace" select="'   '" />
  4.          <xsl:with-param name="by" select="'\  " />
  5.          </xsl:call-template>


 
 

Reply

Marsh Posté le 13-07-2012 à 12:32:42    

Pour remplacer quoi? trois blancs par \ suivi de deux blancs dans une valeur d'attribut?
il manque un ' en fin de valeur du paramêtre by:
 

Code :
  1. <xsl:call-template name="string-replace-all">
  2.          <xsl:with-param name="text" select="@id" />
  3.          <xsl:with-param name="replace" select="'   '" />
  4.          <xsl:with-param name="by" select="'\  '" />
  5.          </xsl:call-template>


 
Par contre, si c'est pour remplacer un ' par un \' dans le contexte d'une valeur d'attribut id, il faut passer la valeur de l'attribut comme paramètre, par exemple avec un appel (a adapter selon ton contexte d'appel) comme
 

Code :
  1. <xsl:template match="node()[@id]">  
  2.    <xsl:call-template name="escape-apos">
  3.      <xsl:with-param name="string">
  4.     <xsl:value-of select="@id"/>
  5.      </xsl:with-param>  
  6.    </xsl:call-template>
  7.    <xsl:apply-templates/>
  8.  </xsl:template>


 
A+,
 


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

Marsh Posté le 16-07-2012 à 17:40:57    

Excellent. Merci beaucoup

Reply

Marsh Posté le 17-07-2012 à 16:22:08    

hannn, désolée mais j'ai une autre petite question !!
 
Alors,  
 
sachant que j'utilise une fonction pour retirer les tirets à mes variables qui s'écrit de cette maniere :  

Code :
  1. <xsl:call-template name="string-replace-all">
  2.          <xsl:with-param name="text" select="@id" />
  3.          <xsl:with-param name="replace" select="'-'" />
  4.          <xsl:with-param name="by" select="'\-'" />
  5.          </xsl:call-template>


 
Je voudrai aussi l'utiliser pour traiter les guillemets pour mes variables!
comment faire?

Reply

Marsh Posté le 17-07-2012 à 18:29:11    

Ben je vois pas ou est le pb:
on positionne le parametre replace avec le guillemet ouvrant, «, et le parametre by avec le texte de remplacement, \«, par exemple ici,  

Code :
  1. <xsl:call-template name="string-replace-all">
  2.  <xsl:with-param name="text" select="@id" />
  3.  <xsl:with-param name="replace" select="'«'" />
  4.  <xsl:with-param name="by" select="'\«'" />
  5. </xsl:call-template>


Et idem pour le guillemet fermant.
 
A+,


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

Marsh Posté le 18-07-2012 à 10:15:31    

Oui merci beaucoup.
 
Mais je vous dire, comment faire pour appliquer la fonction 2 fois à une même variable.
Sauf que je ne veux pas qu'il me l'écrive 2 fois, mais une seule fois sans les guillemets et sans l'apos !!!

Reply

Marsh Posté le 18-07-2012 à 12:23:32    

Une technique standard est de mettre le resultat d'un premier call-template dans une variable et passer la variable comme parametre d'entrée du call template suivant:
Un exemple qui va mettre un \ devant les apostrophes puis les tirets du texte:
 

Code :
  1. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  2.  <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>
  3.  <xsl:template name="string-replace-all">
  4.    <xsl:param name="text" />
  5.    <xsl:param name="replace" />
  6.    <xsl:param name="by" />
  7.    <xsl:choose>
  8.      <xsl:when test="contains($text, $replace)">
  9.        <xsl:value-of select="substring-before($text,$replace)" />
  10.        <xsl:value-of select="$by" />
  11.        <xsl:call-template name="string-replace-all">
  12.          <xsl:with-param name="text"
  13.          select="substring-after($text,$replace)" />
  14.          <xsl:with-param name="replace" select="$replace" />
  15.          <xsl:with-param name="by" select="$by" />
  16.        </xsl:call-template>
  17.      </xsl:when>
  18.      <xsl:otherwise>
  19.        <xsl:value-of select="$text" />
  20.      </xsl:otherwise>
  21.    </xsl:choose>
  22.  </xsl:template>
  23.  <xsl:template name="escape-apos">
  24.  <xsl:param name="string"/>
  25.  <xsl:variable name="apos">&apos;</xsl:variable>
  26.  <xsl:choose>
  27.    <!-- pas d'apostrophe => sortie du texte non modifie -->
  28.    <xsl:when test="not(contains($string, $apos))"><xsl:value-of select="$string"/></xsl:when>
  29.    <xsl:otherwise>
  30.      <!-- apostrophe => sortie du texte avant non modifie -->
  31.      <xsl:value-of select="substring-before($string, $apos)"/>
  32.      <!-- puis de l'apostrophe echappee avec \ -->
  33.      <xsl:text>\&apos;</xsl:text>
  34.      <!-- puis appel recursif pour traiter le texte qui suit l'apostrophe -->
  35.      <xsl:call-template name="escape-apos">
  36.        <xsl:with-param name="string" select="substring-after($string, $apos)"/>
  37.      </xsl:call-template>
  38.    </xsl:otherwise>
  39.  </xsl:choose>
  40. </xsl:template>
  41.  <!-- match des noeud texte non vides -->
  42.  <xsl:template match="text()[not(normalize-space() = '')]">
  43.    <!-- mise du resultat dans une variable -->
  44.    <xsl:variable name="a">
  45.      <xsl:call-template name="escape-apos">
  46.     <xsl:with-param name="string" select="."/>
  47.      </xsl:call-template>
  48.    </xsl:variable>
  49.      <xsl:call-template name="string-replace-all">
  50.         <!-- appel sur le resultat precedent mis en variable -->
  51.         <xsl:with-param name="text" select="$a" />
  52.         <xsl:with-param name="replace" select="'-'" />
  53.         <xsl:with-param name="by" select="'\-'" />
  54.      </xsl:call-template>
  55.  </xsl:template>
  56. </xsl:stylesheet>


Tu peux aussi aller voir cette page, pour la même technique de base (mettre le résultat intermédiaire dans une variable en XSLT 1) mais avec une syntaxe un peu différente.
A+,


Message édité par gilou le 18-07-2012 à 12:55:31

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

Marsh Posté le 18-07-2012 à 14:59:02    

Okay, merci de votre réponse. Je teste ça et je vous redis !!!!

Reply

Sujets relatifs:

Leave a Replay

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