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] traitement de chaine via Variable et apply-templates


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut [XSLT] traitement de chaine via Variable et apply-templates
    Je cherche à sécuriser la saisie coté utilisateur.
    Je veux que le contenu d'une balise X commence toujours par une majuscule et se termine par un point.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <test>le jour se lève</test>
    J'ai fait ça pour arriver à mes fins.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <xsl:param name="chaine2"/>
    <xsl:variable name="chaine">
    <xsl:value-of select="translate(substring(chaine2,1,1),'abcdefghijklmnopqrstwxyv','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
    <xsl:value-of select="substring(chaine2.,2,string-length(chaine2))"/>
    <xsl:if test="substring(chaine2,string-length(chaine2),1)!='.'">.</xsl:if>
    </xsl:variable>
    Ca marche bien avec un xsl:value-of
    Ca ne marche plus avec un xsl:apply-template.

    Le hic c'est que j'ai besoin de passer par un xsl:apply-template pour des trucs dans le genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <test>le jour <i>se</i> lève</test>
    <i> est interprété de façon à mettre le texte en italique.

    L'objectif final est d'obtenir un
    Le jour se lève.

  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
    XSLT est super mauvais pour ce genre de choses. (De manière générale on ne programme pas avec un langage de balises. On template ou on stylise à la rigueur, mais on programme pas.)


    Mais si vraiment il faut, le principe est de ne pas passer une chaîne en paramètre, mais de passer les enfants.

    - Traitement sur le premier nœud texte : text()[1]
    - puis appliquer les templates sur tout ce qui est au milieu
    - traitement sur le dernier nœud texte : text()[last()]

    Bien sûr, si la présence de la balise <i> n'est pas certaine, ça veut dire que le premier nœud texte peut aussi être le dernier. Si la balise <i> commence dès le début, c'est en fait dans le contenu de <i> qu'il va falloir mettre en majuscule. Si la balise </i> s'arrête pile à la fin, c'est dans <i> qu'il faut vérifier s'il y a un point.
    Pas évident.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci pour la réponse, je vais plancher sur ça.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Voilà ce que ça donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <xsl:value-of select="translate(substring(text()[1],1,1),'abcdefghijklmnopqrstwxyv','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/><xsl:value-of select="substring(text()[1],2,string-length(text()[1]))"/>
    <xsl:apply-templates select="descendant::*"/>
    	<xsl:if test="text()[last()]!=text()[1]">
    	<xsl:apply-templates select="text()[last()]"/>
    	</xsl:if>
    <xsl:if test="substring(text()[last()],string-length(text()[last()]),1)!='text()[last()]'">.</xsl:if>
    Reste plus qu'à faire une fonction

  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 : 48
    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
    Pour ce genre de chose , si cela est possible , il faut regarder du côté de Xpath et XSLT 2.0.
    Ces "nouvelles" version sont beaucoup plus riches dans les fonctions de traitement de chaines et d'expressions régulières.

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

Discussions similaires

  1. [XL-2007] récupérer chaine de caractère en plusieurs étapes dans une combobox via variable
    Par chombriko dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 21/05/2012, 09h43
  2. Makefile : variable ignorée et traitement de chaine de caractères
    Par sperca dans le forum Systèmes de compilation
    Réponses: 1
    Dernier message: 03/01/2012, 16h01
  3. [XSLT] xsl:copy-of ou bien xsl:apply-templates
    Par pbernard dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 29/11/2010, 15h22
  4. Réponses: 19
    Dernier message: 03/08/2004, 10h26
  5. [CR]Traitement de chaines dans les formulas
    Par teckilax dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 05/07/2004, 09h01

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