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] Récupérer la fin d'une url ?


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 29
    Points : 16
    Points
    16
    Par défaut [XSLT] Récupérer la fin d'une url ?
    Bonjour,

    Ma question est toute bête..

    J'ai une variable dans mon fichier xsl, elle contient une URL (ou un chemin local).
    Je souhaite juste récupérer la fin de cette url, cad le nom du fichier.

    Ex: Repertoire1/mesimages/toto.jpg

    Je veux avoir toto.jpg

    Biensur l'url est dynamique et change tout le temps...

    J'ai tenté cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:value-of select="substring-after($link,'/')" />
    Je ne connais pas à l'avance la profondeur de l'arborescence etc...

    Peux-ton dire de prendre le dernier / au lieu du 1er dans la fonction substring-after?

    merci d'avance

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Salut !

    à mon avis, la seul chose qu'on puise faire serait un template nommé récursif dans ce style :
    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="afterLast">
       <xsl:param name="str"/>
       <xsl:param name="char"/>
       <xsl:choice>
          <xsl:when test="contains($str, $char)">
              <xsl:call-template name="afterLast">
                  <xsl:with-param name="str" value="substring-after($str,$char)"/>
                  <xsl:with-param name="char" value="$char"/>
              </xsl:call-template>
          </xsl:when>
          <xsl:otherwise>
              <xsl:value-of select="$str"/>
         </xsl:otherwise>
       </xsl:choice>
    </xsl:template>
    pour l'appeller, il te suffit de faire par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <xsl:call-template name="afterLast">
       <xsl:with-param name="str" value="$link"/>
       <xsl:with-param name="char" value="/"/>
    </xsl:call-template>

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Warning: domxml_xslt_stylesheet_file(): compilation error: file result.xsl element choice in /home/indexit/indexit.php on line 89
     
    Warning: domxml_xslt_stylesheet_file(): xsltStylePreCompute: unknown xsl:choice in /home/indexit/indexit.php on line 89
     
    Warning: process(): xsltApplyOneTemplate: choice was not compiled in /home/indexit/indexit.php on line 91
     
    Warning: process(): xsltApplyOneTemplate: choice was not compiled in /home/indexit/indexit.php on line 91



    J'ai mon fichier xsl qui est un peu complexe aussi alors je ne sais pas si j'ai bien placé le code...
    voila comment j'ai procédé :
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:nutch="http://www.nutch.org/opensearchrss/1.0/" xmlns:opensearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:php="http://php.net/xsl" exclude-result-prefixes="nutch opensearch php" >
    <xsl:output method="html" indent="yes" encoding="iso-8859-1" omit-xml-declaration="no" />
    <xsl:template name="afterLast">
    ...
    </xsl:template>
     
    <xsl:template match="/rss/channel">
    	<xsl:for-each select="item">
    ...
    <xsl:if>
    ...
    </xsl:if>
    <xsl:if>
    ...
    <xsl:call-template name="afterLast">
      <xsl:with-param name="str" value="$link"/>
      <xsl:with-param name="char" value="/"/>
    </xsl:call-template>
    ...
    </xsl:if>
    ...
    	</xsl:for-each>
     </xsl:template>
    </xsl:stylesheet>
    j'ai simplifié au maximum mon fichier..

    une idée du pk du comment de l'erreur?


    EDIT : je trouve pas d'info sur xsl:choice? c'est pas plutôt xsl:choose?

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    oui, c'est choose, pas choice, désolé... (j'ai confondu XSLT et XSD )

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    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
    16
    17
    18
    19
    Warning: process(): runtime error: file result.xsl element call-template in /home/index/index.php on line 91
     
    Warning: process(): xsltApplyOneTemplate: loop found ??? in /home/index/index.php on line 91
     
    Warning: process(): try increasing xsltMaxDepth (--maxdepth) in /home/index/index.php on line 91
     
    Warning: process(): Templates: in /home/index/index.php on line 91
     
    Warning: process(): #0 in /home/index/index.php on line 91
     
    Warning: process(): name afterLast in /home/index/index.php on line 91
     
    Warning: process(): in /home/index/index.php on line 91
     
    Warning: process(): #1 in /home/index/index.php on line 91
     
    Warning: process(): name afterLast in /home/index/index.php on line 91
     
    Warning: process(): in /home/index/index.php on line 91
    J'ai ça maintenant comme erreur en mettant choose.

  6. #6
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Il semble que ton processeur XSLT ne supporte pas la récursivité... étrange... je ne vois pas vraiment comment faire autrement... l'itératif étant banni en XSLT...

    vérifie que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    substring-after('a/b/c/d', '/')
    renvoie bien b/c/d par exemple (que le / ne soit pas conservé)...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    oui ça me donne bien b/c/d

    comment puis-je vérifier si mon processeur XSLT supporte la récursivité ??

  8. #8
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    bah, normalement il suffit de faire un template qui s'appelle lui-même (sous conditions bien évidemment, sinon récursivitée infinie)

    à priori, soit ton URL contient trop de / soit tu processeur ne supporte pas la récursivité (ce qui est très étrange...)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    je ne pense pas que mon url contient trop de / ...

    et je ne sais pas comment vérifier kel processeur xslt j'utilise? si on peut le changer par un qui permet la récursivité?

    dans mon fichier xsl j'ai un foreach qui fonctionne.. pourquoi un when ne fonctionnerait-il pas?!!

    Merki

  10. #10
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    Remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:with-param name="char" value="/"/>
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:with-param name="char" value="'/'"/>
    Le slash sans simples quotes revient à passer la racine du document XML en paramètre au template récursif. C'est ce qui devait sans doute le lancer dans une boucle infinie...

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    Bonjour GrandFather,

    Hélas non ça ne change rien....


  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    personne n'a une autre solution? un autre coup de pouce?

    Quel processeur XSLT utilisez-vous?

    comment je peux changer le mien?

    Merci

  13. #13
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Quelle version de PHP utilises-tu ?

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    PHP Version 4.3.10-16

    dans mon php info j'ai ca (pour le xsl) :

    • '--with-dom-xslt=shared,/usr'
    • '--with-dom-exslt=shared,/usr'
    • '--enable-xslt=shared'
    • '--with-xslt-sablot=shared,/usr'


    et apparemment j'ai aussi un module DOMXML.

    normalement c'est un serveur sous debian.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    C'est bon.... après plusieurs test...j'ai trouvé l'erreur...

    Alors déjà on m'a conseillé de mettre le xsl dans le xml directement et de juste lancer le xml ce qui est vraiment lpus pratique pour l'affichage des erreurs!

    C'est grace à cette méthode que j'ai trouvé...

    En fait dans le code de Swoög il faut remplacer les "value" par des "select" et ça fonctionne!

    Merci bcp pour votre aide!

  16. #16
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par -ADX-
    En fait dans le code de Swoög il faut remplacer les "value" par des "select" et ça fonctionne!


    Et j'ai moi-même fait un copier-coller de son code sans rien remarquer...
    Quel je fais...

    En attendant, Swoög :

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/12/2010, 14h12
  2. Ajouter un timestamp à la fin d'une url
    Par shadeoner dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/10/2010, 11h53
  3. [RegEx] remplacement d'une chaine à la fin d'une URL
    Par ozzeo dans le forum Langage
    Réponses: 1
    Dernier message: 13/05/2009, 15h34
  4. Réponses: 2
    Dernier message: 05/10/2004, 22h43

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