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 :

[XML + XSL] petite confusion avec text()


Sujet :

XSL/XSLT/XPATH XML

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 26
    Points : 17
    Points
    17
    Par défaut [XML + XSL] petite confusion avec text()
    Bonjour.
    Je pense que je dois confondre plusieurs choses. J'explique, la structure de mon XML est la suivante:

    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
    27
    28
     
    <?xml version="1.0" encoding="iso8859-1"?>
    <?xml-stylesheet type="text/xsl" href="test.xsl"?>
    <GRILLE codtrt="CTA150G50">
    	<BLOC nom="COMPTE">
    		<CHAMP nom="CODPLANCTB" prompt="Compte">51299</CHAMP>
    		<CHAMP nom="LIBPLANCTB" prompt="">Banque POMMIER</CHAMP>
    		<CHAMP nom="CODIMM" prompt="Immeuble">0</CHAMP>
    		<CHAMP nom="ADRRED" prompt=""></CHAMP>
    		<CHAMP nom="CODSERV" prompt="Service"></CHAMP>
    		<CHAMP nom="CODCLI" prompt="Propriétaire">1257</CHAMP>
     
    	</BLOC>
    	<BLOC nom="ECRICTBPROB">
    		<COLONNES>
    			<TITRE largeur="1">Date</TITRE>
    			<TITRE largeur="1">Journal / N° pièce</TITRE>
    		</COLONNES>
    		<ENR>
    			<CHAMP nom="DATCTB">30/04/2004</CHAMP>
    			<CHAMP nom="CODJOU">JBC</CHAMP>
    		</ENR>
    		<ENR>
    			<CHAMP nom="DATCTB">31/03/2002</CHAMP>
    			<CHAMP nom="CODJOU">JBC</CHAMP>
    		</ENR>
    	</BLOC>
    </GRILLE>
    Comme vous pouvez le voir, certains éléments dans /BLOC/CHAMP n'ont pas de prompt ou de valeurs ou les 2.

    J'ai commencé à construire ce XSL:
    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
    27
    28
    29
    30
    31
    32
    33
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:output indent="no"/>
      <xsl:template match="/">
        <html>
          <body><xsl:apply-templates/></body>
        </html>
      </xsl:template>
      <xsl:template match="*[ENR]">
        <table border="1"><xsl:apply-templates/></table>
      </xsl:template>
      <xsl:template match="ENR">
        <tr><xsl:apply-templates/></tr>
      </xsl:template>
      <xsl:template match="COLONNES">
        <tr><xsl:apply-templates/></tr>
      </xsl:template>
      <xsl:template match="TITRE">
        <td>
          <xsl:attribute name="colspan"><xsl:value-of select="@largeur"/></xsl:attribute>
          <xsl:attribute name="border">1</xsl:attribute>
          <xsl:apply-templates/></td>
      </xsl:template> 
      <xsl:template match="ENR/CHAMP">
        <td><xsl:apply-templates/></td>
      </xsl:template>
      <xsl:template match="BLOC/CHAMP[text()]"> 
        <xsl:if test="@prompt"><br /><xsl:value-of select="@prompt"/> : <xsl:apply-templates/></xsl:if>
        <xsl:if test="@prompt='*'"> | <xsl:apply-templates/></xsl:if>
      </xsl:template>
      <xsl:template match="CHAMP[@prompt='']">
        | <xsl:apply-templates/>
      </xsl:template> 
    </xsl:stylesheet>
    La partie suivante me pose problème:
    <xsl:template match="BLOC/CHAMP[text()]">
    <xsl:if test="@prompt"><br /><xsl:value-of select="@prompt"/> : <xsl:apply-templates/></xsl:if>
    <xsl:if test="@prompt='*'"> | <xsl:apply-templates/></xsl:if>
    </xsl:template>
    J'aurai aimé que mon fichier résultat (pour les noeuds /BLOC/CHAMP) soit de la forme:
    prompt : valeur
    prompt : valeur

    et que si le ou les éléments suivant n'ont pas de prompt, alors:
    prompt : valeur | valeur2 | valeur3 ...
    prompt : valeur | valeur2 | valeur3 ...
    * déjà, j'aimerai tester si le champ est vide, alors ne rien afficher. Apparemment, match="BLOC/CHAMP[text()]" ne semble pas la bonne expression? (vu que je n'ai pas une structure en for, je pars toujours de la racine, c'est bien ça?)
    * de plus, je ne comprends pas pourquoi <xsl:if test="@prompt='*'"> | <xsl:apply-templates/></xsl:if> est exécuté s'il n'y a pas de prompt alors que si j'essaie <xsl:if test="@prompt=''"> | <xsl:apply-templates/></xsl:if>, ce dernier ne l'est pas. J'aurai plutôt pensé le contraire.

    Comment expliquer ce 2ème point et résoudre le premier problème?
    Merci de votre aide!

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

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

    en faite faut tester ton attribut de la même facon que ton noeud CHAMP avec /text()

    d'ou:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test="@prompt/text()">
    car avant tu testais si il étais la ou pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xsl:if test="@prompt"><
    ++

    Thierry

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    ok, merci! Cela explique donc le 2ème point.
    Et pour le premier point? (vu que le test du text() du noeud ne semble pas fonctionner)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 625
    Points : 1 666
    Points
    1 666
    Par défaut
    Moi ce que je fais dans ce cas c'est dans l'apply-template que je met la condition pas dans le template et normalement ca marche!

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2004
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    ok, j'ai fait comme tu m'as dit, au final mon code est le suivant:

    <xsl:template match="BLOC/CHAMP">
    <xsl:if test="@prompt!='' and text()"><br /><xsl:value-of select="@prompt"/> : <xsl:apply-templates/></xsl:if>
    <xsl:if test="@prompt='' and text()"> | <xsl:apply-templates/></xsl:if>
    </xsl:template>

    et tout fonctionne!

    Merci!

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

Discussions similaires

  1. XML+XSL pour Html avec fichiers son
    Par pwyll2 dans le forum XSL/XSLT/XPATH
    Réponses: 21
    Dernier message: 27/05/2011, 11h23
  2. Probléme cache avec IE et XML/XSL coté client.
    Par rataflo dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 06/08/2005, 19h06
  3. [xml-xsl] Probleme avec position()
    Par seb30 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 21/04/2005, 11h10
  4. [XML][XSL][FOP] transformation xml avec fop
    Par Le Marlou dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 05/12/2003, 16h58

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