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!