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
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    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 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    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.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

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

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 9
    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
    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