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 :

[XSLT] Normalisation des valeurs pour les URL


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut [XSLT] Normalisation des valeurs pour les URL
    Soit le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img><xsl:attribute name="src"><xsl:value-of select="@filename"/></xsl:attribute></img>
    Rien à redire à ce code simple sauf quand @filename contient des caractères spéciaux pour les URL. J'ai parfois comme résultat un code du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img src="sample#123.gif"/>
    alors qu'il faudrait idéalement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img src="sample%23123.gif"/>
    Comment faire?
    Existe-t-il une focntion prédéfinie de normalisation des URL en XSLT?
    Merci.

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    En fait il faudrait une fonction du genre normalize-space() et qui pourrait s'appeler normalize-url() par exemple.
    Quelqu'un peut-il confirmer que ça n'existe pas?

    Jusqu'à présent j'utilise une fonction javascript appelée Escape() dans l'XSL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      <msxsl:script language="JScript" implements-prefix="js">
      <![CDATA[
        function Escape(nodeList)
        {
          var text = getNode(nodeList).text;
          return encodeURIComponent(text);//escape(text);
        }
      ]]>
      </msxsl:script>
    Le but est de retirer tout code javascript des XSL.
    Merci.

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Dans l'attente impatiente d'une réponse/solution, j'ai fait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    <xsl:template name="c_escape">
    <xsl:param name="txt"/>
    <xsl:if test="string-length($txt)">
    <xsl:choose>
    <xsl:when test="$txt='#'">%23</xsl:when>
    <xsl:when test="contains($txt,'#')">
    <xsl:variable name="before" select="substring-before($txt,'#')"/>
    <xsl:variable name="after" select="substring-after($txt,'#')"/>
    <xsl:if test="string-length($before)"><xsl:value-of select="$before"/></xsl:if>%23<xsl:if test="string-length($after)"><xsl:call-template name="c_escape"><xsl:with-param name="txt" select="$after"/></xsl:call-template></xsl:if>
    </xsl:when>
    <xsl:otherwise><xsl:value-of select="$txt"/></xsl:otherwise>
    </xsl:choose>
    </xsl:if>
    </xsl:template>
    Ça permet de remplacer un seul caractère, en l'occurence # par %23 (c'est le seul qui m'embête pour l'instant).
    En espérant pouvoir généraliser un jour...

  4. #4
    Membre expérimenté
    Avatar de virgul
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Salut,

    pourquoi ne pas essayer avec replace()?
    "Life is short don't forget to inhale"
    Mais: "Mieux vaux arriver en retard dans ce monde... qu'en avance à l'autre."

  5. #5
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Citation Envoyé par virgul
    pourquoi ne pas essayer avec replace()?
    ??? n'existe ni en xpath 1.0 ni en xslt 1.0 le seul equivalent est translate

    Citation Envoyé par W3C
    Function: string translate(string, string, string)

    The translate function returns the first argument string with occurrences of characters in the second argument string replaced by the character at the corresponding position in the third argument string. For example, translate("bar","abc","ABC") returns the string BAr. If there is a character in the second argument string with no character at a corresponding position in the third argument string (because the second argument string is longer than the third argument string), then occurrences of that character in the first argument string are removed. For example, translate("--aaa--","abc-","ABC") returns "AAA". If a character occurs more than once in the second argument string, then the first occurrence determines the replacement character. If the third argument string is longer than the second argument string, then excess characters are ignored.

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Fonction inexistante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="function-available('replace')"/>
    Je ne la vois pas dans ma doc et le code précédant renvoie "false.

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Avec translate() il n'est pas possible de remplacer un caractère par une chaîne de caractères. Dans mon exemple il s'agit de remplacer # par %23.
    Accessoirement, l'intérêt de translate() me parait assez réduit.

  8. #8
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Citation Envoyé par camboui
    Avec translate() il n'est pas possible de remplacer un caractère par une chaîne de caractères. Dans mon exemple il s'agit de remplacer # par %23.
    Accessoirement, l'intérêt de translate() me parait assez réduit.
    Raison pour laquelle je ne l'ai pas donné avant Je le met en equivalent d'un quelconque replace().
    Seul solution pour toi, un template nommé recursif utilisant substring-before et substring-after qui va boucler sur la chaine tant qu'il y a des #

    Citation Envoyé par camboui
    Accessoirement, l'intérêt de translate() me parait assez réduit.
    Pas pour moi, je l'utilise tres souvent.C'est une question de pratique

  9. #9
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Oui, merci. C'est bien ce que j'ai fait dans le code présenté ci-avant (template name c_escape).

    Je m'étonne tout de même que personne ne soit tombé sur cet os où qu'il n'ait pas été pensé par les 'faiseurs' des specs XML/XSLT.
    Devoir construire des URL est courant. Et il y a pas mal de caractères interdits comme =/?#& qui exigent une retranscription.

  10. #10
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Points : 10 927
    Points
    10 927
    Par défaut
    Citation Envoyé par camboui
    Devoir construire des URL est courant. Et il y a pas mal de caractères interdits comme =/?#& qui exigent une retranscription.
    Parce que tu travailles web hors xml/xslt ne cible pas particulierement ce domaine.

Discussions similaires

  1. Réponses: 0
    Dernier message: 03/06/2015, 14h33
  2. Descripteur et valeur des attributs pour les instances
    Par 3DKermit dans le forum Général Python
    Réponses: 5
    Dernier message: 25/01/2013, 14h39
  3. Réponses: 2
    Dernier message: 09/12/2008, 11h36
  4. Réponses: 6
    Dernier message: 09/12/2007, 14h32
  5. Réponses: 5
    Dernier message: 03/12/2007, 23h45

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