Bonjour,

Je débute un test visant à transformer un fichier XML en un autre. J'ai essayé de chercher de bons cours en ligne, mais n'ai rien trouvé qui puisse m'aider à bien débuter et à résoudre mon problème

Le fichier XML de départ est sous la forme suivante :
<documents>
   <document>
      <field fieldname="nom">valeur</field>
      <field fieldname="autre">valeur</field>
      <field fieldname="statut">valeur(0-10)</field>
   </document>
      ...
   <document>
   </document>
</documents>


Je souhaiterai pouvoir n'afficher que les documents correspondants à un statut donné (par exemple statut="3"), mais j'avoue ne pas vraiment savoir comment m'y prendre...

Pour le moment, mon .xsl affiche tous les documents :
<xsl:template match="documents">
	<html><body>
	<p>Liste des documents : </p>
		<table border="1px">
		<xsl:apply-templates select="document" />
		</table>
	</body></html>
</xsl:template>

<xsl:template match="document">
	<tr>
		<xsl:apply-templates select="field" />
	</tr>
</xsl:template>

<xsl:template match="field">
	<td>
		<xsl:value-of select="." />
	</td>
</xsl:template>


Une idée ? Ou bien une adresse avec des cours complets (et pas mal d'exemples, autres que les exemples bateaux donnés par tous les sites ^^).

Merci,
Modifié par SynRJ (15 Jun 2009 - 09:35)
En fait, pour préciser ma question, j'aimerais savoir s'il est possible de faire une comparaison de ce type :
<xsl:if test="value-of select='.' = '1'">
   //traitement
</xsl:if>
Bonjour,

Je ne suis pas sûr d'avoir bien compris ta question... mais a priori, pour ne sélectionner, par exemple, que les éléments document possédant un élément field ayant un attribut fieldname valant statut et valant eux-mêmes 3, tu peux utiliser la commande XPath suivante:

document/field[@fieldname='statut']


Il suffit ensuite de tester la valeur de l'élément field en question, et de la comparer à 3...
Merci de ta réponse,

Alors, j'ai fais la chose suivante :
<table border="1px">
		<xsl:if test="document/field[@fieldname='status'] = '1'">
			<tr><xsl:value-of select="." /></tr>
		</xsl:if>
		</table>
Le soucis c'est que ces lignes me renvoient tous les documents, pas seulement ceux dont le champ "status" vaut 1.

Autrement j'avais fait ça :
<xsl:template match="field">
	<xsl:if test="@fieldname='status'">
		<xsl:if test=". = '1'">
				<tr><xsl:value-of select="." /></tr>
		</xsl:if>
	</xsl:if>
</xsl:template>
Ce qui me permet de récupérer uniquement les documents dont le champ "status" est à 1, le problème c'est que je reçois un tableau remplit de 1, je ne sais pas comment "remonter dans le ." pour obtenir la valeur de l'ensemble des champs du document.
Modifié par SynRJ (15 Jun 2009 - 09:10)
Bonjour,

Pour récupérer les éléments field de ton document, il faut d'abord remonter d'un cran dans la hiérarchie XML, avec .. Si tu écris dans ton if (celui du template), <xsl:value-of selec="../field" />, tu obtiendras la valeur du premier élément field, fils de l'élément parent de celui que tu considères, autrement dit, ici, la valeur de l'élément field possédant un attribut nom.

Si tu veux afficher l'ensemble des éléments field de l'élément document qui t'intéresse, tu peux alors classiquement soit faire appel à une boucle (<xsl:for-each select="../field">...), soit faire appel à un template...
Merci beaucoup, ça fonctionne :
<xsl:template match="field">
	<xsl:if test="@fieldname='status'">
		<xsl:if test=". = '1'">
			<tr>
				<xsl:for-each select="../field">
					<td><xsl:value-of select="." /></td>
				</xsl:for-each>
			</tr>
		</xsl:if>
	</xsl:if>
</xsl:template>

Smiley biggrin