IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XSL/XSLT/XPATH XML Discussion :

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


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2012
    Messages : 40
    Points : 18
    Points
    18
    Par défaut Insertion de caractère dans un nom de mes champs XML
    Bonjour,

    J'ai un fichier XML construit comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      <toto ID="Bonjour-LaLA-LILO">
        <Title>Oui</Title>
      </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 ?

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Mauvaise solution -_-°. Échapper les tirets avant de les mettre en BDD, c'est le boulot du "truc" qui insère dans la BDD.

    Ce n'est pas XSLT*qui insère des trucs dans la BDD, donc ce n'est pas XSLT*qui doit faire ça.

    Toujours poursuivre les bonnes solutions, jamais les mauvaises.

  3. #3
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2012
    Messages : 40
    Points : 18
    Points
    18
    Par défaut
    Voici le site que l'on m'a conseillé !
    http://geekswithblogs.net/Erik/archi...01/120915.aspx

    Pourtant je ne comprend pas trop quand même ..

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Je blaguais pas, en fait.

    XSLT n'est pas ce que tu cherches. Fais autrement. Échappe tes tirets d'une autre manière.

  5. #5
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2012
    Messages : 40
    Points : 18
    Points
    18
    Par défaut
    J'exploite mon XSLT et XML après en PHP.
    Vous voulez donc que je le fasse avec ce script ?

    si je pose une question sur un forum, c'est pour qu'on puisse m'aider! Donc si vous ne voulez pas m'aider dites le explicitement, cela fera gagner du temps aux deux.

    Merci.

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Citation Envoyé par Ellia Voir le message
    J'exploite mon XSLT et XML après en PHP.
    Vous voulez donc que je le fasse avec ce script ?
    Possiblement. Mais après, ça dépend de pourquoi la BDD n'accepte pas les tirets. Mes bases de données à moi acceptent toujours les tirets. Ton histoire est donc suspecte, et le problème doit sans doute être réglé à un autre niveau.
    Il faudrait que tu nous expliques ce qui ne va pas, au juste, avec les tirets.

    (Note : il ne s'agit pas de quelque chose que je veux. Il s'agit d'utiliser les outils qui sont prévus pour.)

    Citation Envoyé par Ellia Voir le message
    si je pose une question sur un forum, c'est pour qu'on puisse m'aider! Donc si vous ne voulez pas m'aider dites le explicitement, cela fera gagner du temps aux deux.
    *Baîlle*. Et je fais comment pour deviner quels sont les outils que tu utilises, mademoiselle la maligne ?

    Je t'ai dit, très clairement, que XSLT n'était pas l'outil à utiliser, qu'il fallait un autre outil. Les autres outils que tu as à ta disposition, je ne les connais pas.
    Que tu n'aies pas pensé dès le début à les donner, je peux le comprendre. Que tu ne les ai pas donnés dès ton second message, c'est de ta faute, et de ta faute seulement. J'ai été très clair : la solution est autre chose que XSLT. Il fallait donc parler de ce que tu as d'autre que XSLT. Simple, et c'est moi qui te l'ai dit.

  7. #7
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2012
    Messages : 40
    Points : 18
    Points
    18
    Par défaut
    Je vous remercie de m'avoir répondu.

    Alors, j'utilise Mon scrip PHP pour transformer mon XML avec XSLT.
    Ce script PHP crée donc un fichier SQL qui possède tout la création de la base.
    Cependant, lorque je la lance, elle bloque à un moment ( donc ne termine pas le script ) et me dis comme erreur :

    ERROR 1064 (42000) at line 101: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-t-elle_ete_signee=TDF.choix where ...
    Voilà, donc ça bloque au TIRET !

    J'ai donc essayé par moi même, de les echapper en php avec str_replace, sauf que cela fausse mes clause WHERE, car dans la base où je puise mes résultats, tout est stocké avec un tiret, et non pas échappés...

  8. #8
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    @Ellia
    Pour faire ça en xslt, le raisonnement est le suivant:
    [1] Mettez d'abord un template de transformation identitaire puisque la plupart principale on veut la préserver.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:template match="*|@*|text()|comment()|processing-instruction()">
        <xsl:copy>
            <xsl:apply-templates select="*|@*|text()|comment()|processing-instruction()" />
        </xsl:copy>
    </xsl:template>
    [2] Puis, identifiez les parts dans lesquelles on veut faire effectuer le changement.

    [2.1] Par exemple, si on désire le changement n'appaître que dans les attribut de nom ID, on peut mettre un template dans le xslt document comme ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <xsl:template match="@*[name()='ID']">
        <xsl:attribute name="{name()}">
            <xsl:call-template name="string-replace-all">
                <xsl:with-param name="text" select="." />
                <xsl:with-param name="replace" select="'-'" />
                <xsl:with-param name="by" select="'\-'" />
            </xsl:call-template>
        </xsl:attribute>
    </xsl:template>
    Ici, le template nommé string-replace-all est celui montré dans la page que vous référée. Je veux bien la donner le crédit de convenience mais pas nécessairement d'originalité. C'est un peu lieu comme. Il est Sous-entendu que vous copiez le template et le mettez dans le document xslt aussi.

    Puisque ce template a un match attribut de nature plus spécifique que celui du template identitaire, il va sortir vainqueur et être executé.

    [2.1.1] Si vous entendez le changement d'apparaître dans tous les attributs, il y a une chose à faire de plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <xsl:template match="@*" priority="100">
        <xsl:attribute name="{name()}">
            <xsl:call-template name="string-replace-all">
                <xsl:with-param name="text" select="." />
                <xsl:with-param name="replace" select="'-'" />
                <xsl:with-param name="by" select="'\-'" />
            </xsl:call-template>
        </xsl:attribute>
    </xsl:template>
    Voyez, vous mettez un attribut priority de valeur positif quelque peu arbitraire. 100, 1000, 30... tant que vous voulez à condition que vous respectez quelque simple régle à observer dans la compétition de "match": la raison est ce match n'est plus spécifique que celui du template identitaire. (Vous allez rechercher le détail de cet attribut vous-même.)

    [2.2] Si vous désirez le changement appaître dans les textes aussi, par le même raisonnement, vous mettiez un template de ce gens en plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:template match="text()" priority="100">
        <xsl:call-template name="string-replace-all">
            <xsl:with-param name="text" select="." />
            <xsl:with-param name="replace" select="'-'" />
            <xsl:with-param name="by" select="'\-'" />
        </xsl:call-template>
    </xsl:template>
    avec l'attribut priority encore pour la même raison. Remarquez les petites differences par rapport au [2.1.1].

    [2.3] C'est possible de le faire pour les comment() et processing-instruction() aussi mais c'est peu probable vous avez le besoin. En tout cas, écrivez le moins de template et plus spécifique dans le match pour atteindre le but - c'est lier à la performance et à la clarté du travail.

    [3] Vous copiez le template string-replace-all comme dit dans [2.1]

    Voilà.

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Alors, j'utilise Mon scrip PHP pour transformer mon XML avec XSLT.
    Ce script PHP crée donc un fichier SQL qui possède tout la création de la base.
    Cependant, lorque je la lance, elle bloque à un moment ( donc ne termine pas le script ) et me dis comme erreur :

    ERROR 1064 (42000) at line 101: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '-t-elle_ete_signee=TDF.choix where ...
    ................

    Donc... Si je comprends bien... Tu génères un script SQL avec du XSLT ?
    Déjà ça il fallait pas le faire. Mais je suppose qu'il n'est plus envisageable de faire les choses correctement.

    ... Et en plus il y a des tirets dans les noms de tes colonnes. Ça non plus il fallait pas. Mais pareil, je suppose que c'est trop tard.

    Bref. Effectivement, tu as besoin d'échapper tes tirets en XSLT. Voyons la solution.

    Pour utiliser le code que tu avais trouvé :
    de temps en temps, dans ton XSLT, tu as des trucs qui ressemblent à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="machin"/>
    et qui crée du code avec des tirets dedans. C'est eux que tu veux modifier.
    Il faut les remplacer par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xsl:call-template name="string-replace-all">
      <xsl:with-param name="text" select="machin" />
      <xsl:with-param name="replace" select="'-'" />
      <xsl:with-param name="by" select="'\-'" />
    </xsl:call-template>
    Voilà.

    "C'est compliqué" => Oui, comme je l'ai dit plusieurs fois, il ne fallait pas générer du SQL avec du XSLT.

    Note : il est possible que ton code soit encore plus compliqué. Dans ce cas il va bien falloir que tu te décides à nous le montrer.

  10. #10
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2012
    Messages : 40
    Points : 18
    Points
    18
    Par défaut
    Merci !

    le truc c'est que je le fais pour aussi échapper mes quotes, mais j'ai l'impression qu'il ne prend pas en compte : car je fais ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <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>
    Mais il ne me les échappe pas...

    Une solution s'il vous plait??

  11. #11
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 621
    Points
    21 621
    Par défaut
    Le template en question ne peut faire qu'un seul échappement à la fois, pas deux.

    Le plus simple est de l'appeler une fois pour les tirets, et de l'appeler sur le résultat, pour les quotes.

  12. #12
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2012
    Messages : 40
    Points : 18
    Points
    18
    Par défaut
    Oui c'est ce que je fais, dans une partie de mon programme, je l'utilise pour les tirets, et dans une autre partie c'est pour les apostrophes..

  13. #13
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Mai 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Mai 2012
    Messages : 40
    Points : 18
    Points
    18
    Par défaut
    comment faire pour appeler le template sur le resultat, étant donné que je fais comme cela :

    <
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    xsl:call-template name="string-replace-all">
             <xsl:with-param name="text" select="@id" />
             <xsl:with-param name="replace" select="'-'" />
             <xsl:with-param name="by" select="'\-'" />
             </xsl:call-template>

    Comment faire pour que je traite aussi les quotes dans ce cas là?

  14. #14
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Mets le résultat dans une variable.

Discussions similaires

  1. Limite des 218 caractères dans un nom de fichier
    Par Didier Gonard dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 28/02/2008, 14h28
  2. Changer des caractères dans les noms de fichiers
    Par ForgetTheNorm dans le forum Linux
    Réponses: 2
    Dernier message: 07/01/2008, 14h26
  3. Insertion de caractère dans un JPasswordField
    Par barbiche dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 24/03/2007, 01h52
  4. insert un caractère dans un fichier text.
    Par toctoc dans le forum Delphi
    Réponses: 5
    Dernier message: 06/07/2006, 08h36
  5. [MFC] Problème d'insertion du caractère ' dans une BD
    Par julien.nasser dans le forum MFC
    Réponses: 5
    Dernier message: 21/04/2006, 09h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo