[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:
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:
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!