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

  FORUM HardWare.fr
  Programmation
  XML/XSL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2147337
Ellia
Peace and Love
Posté le 27-06-2012 à 15:11:20  profilanswer
 

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 ?

mood
Publicité
Posté le 27-06-2012 à 15:11:20  profilanswer
 

n°2147389
gilou
Modérateur
Modzilla
Posté le 27-06-2012 à 21:34:40  profilanswer
 

[: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é!  --
n°2147423
Ellia
Peace and Love
Posté le 28-06-2012 à 10:01:44  profilanswer
 

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

n°2147434
gilou
Modérateur
Modzilla
Posté le 28-06-2012 à 11:11:30  profilanswer
 

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é!  --
n°2147445
rufo
Pas me confondre avec Lycos!
Posté le 28-06-2012 à 12:50:30  profilanswer
 

<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
n°2147466
Ellia
Peace and Love
Posté le 28-06-2012 à 15:06:10  profilanswer
 

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...

n°2147467
gilou
Modérateur
Modzilla
Posté le 28-06-2012 à 15:07:08  profilanswer
 

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é!  --
n°2147475
Ellia
Peace and Love
Posté le 28-06-2012 à 15:35:07  profilanswer
 

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

n°2147476
gilou
Modérateur
Modzilla
Posté le 28-06-2012 à 15:52:49  profilanswer
 

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é!  --
n°2149149
Ellia
Peace and Love
Posté le 12-07-2012 à 16:07:28  profilanswer
 

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
mood
Publicité
Posté le 12-07-2012 à 16:07:28  profilanswer
 

n°2149172
gilou
Modérateur
Modzilla
Posté le 12-07-2012 à 20:34:11  profilanswer
 

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é!  --
n°2149208
Ellia
Peace and Love
Posté le 13-07-2012 à 10:12:02  profilanswer
 

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>


 
 

n°2149228
gilou
Modérateur
Modzilla
Posté le 13-07-2012 à 12:32:42  profilanswer
 

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é!  --
n°2149533
Ellia
Peace and Love
Posté le 16-07-2012 à 17:40:57  profilanswer
 

Excellent. Merci beaucoup

n°2149679
Ellia
Peace and Love
Posté le 17-07-2012 à 16:22:08  profilanswer
 

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?

n°2149692
gilou
Modérateur
Modzilla
Posté le 17-07-2012 à 18:29:11  profilanswer
 

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é!  --
n°2149726
Ellia
Peace and Love
Posté le 18-07-2012 à 10:15:31  profilanswer
 

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 !!!

n°2149744
gilou
Modérateur
Modzilla
Posté le 18-07-2012 à 12:23:32  profilanswer
 

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é!  --
n°2149762
Ellia
Peace and Love
Posté le 18-07-2012 à 14:59:02  profilanswer
 

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


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

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

 

Sujets relatifs
Lecture, insertion/création fichierRécupérer les nombres d'une chaine de caractère ???
Insertion checkbox dans page html et affichage valeurremplacer un caractère dans une chaine
XSLT / XML : position d'un noeudMacro Excel -> ajouter un caractère dans une cellule
Requete insertionProblème d'insertion de donnée ODB dans un QTableView
insertion des donne javascripte dans une BDFPDF et caractère spéciaux
Plus de sujets relatifs à : Insertion de caractère dans un nom de mes champs XML


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