Rechercher : dans
Par :

[XSLT] Boucles et tableaux...

Dernière réponse le 11 jan 2007 à 18:39:36 Reivax962, le 11 jan 2007 à 12:25:44 
 Signaler ce message aux modérateurs

Bonjour,

J'ai, d'un côté, un document XML qui comporte un nombre indéterminé de balises <element nom="" valeur="">.

Je voudrais, via une feuille de style XSLT, afficher les données de ces <element> dans un tableau de N colonnes, N étant prédéfini (3 ou 4, par exemple).
Je n'arrive pas à comprendre comment on peut faire quelque chose comme ça...

Pour le moment, j'affiche tout sur une seule ligne :

<div style="width:100%; overflow:auto; overflow-y:hidden;">
	<table border="0" class="form" style="margin-bottom:20px;">
		<tr>
			<!--on affiche tous les <element> en question-->
			<xsl:apply-templates select="child::node()" />
		</tr>
	</table>
</div>
<!--Et le template qui va bien :-->
<xsl:template match="/sectionClient/element">
	<td>
		<b><xsl:value-of select="@Nom" /> : </b>
		<xsl:value-of select="@Valeur" />
		<xsl:if test="@Nom='Adresse IP fixe'">
			<small>
			(<a href="telnet://{@Valeur}" target="_BLANK">telnet</a>) 
			(<a href="http://{@Valeur}" target="_BLANK">http</a>)
			</small>
		</xsl:if>
	</td>
</xsl:template>
Voilà... Tout s'affiche sur une ligne, et je ne sais pas comment couper la ligne de façon régulière, tous les 3 ou 4 éléments...

Merci de votre aide !

Xavier
Configuration: Windows XP
Firefox 2.0.0.1

Meilleures réponses pour « [XSLT] Boucles et tableaux... » dans :
Trier un tableau sans utiliser la fonction sort VoirTrier un tableau sans utiliser la fonction sort D'abord on initialise une variable $max avec la 1ère valeur de tableau. Ensuite on va faire une boucle tant que le tableau contient encore des éléments. C'est avec la fonction splice qui a le rôle...
Inverser les éléments d'un tableau -Récursivité- VoirVoici une procédure récursive qui permet d’inverser les éléments d’une partie d’un tableau compris entre la position p et n : Procedure Inverser (Var t : Tab; p, n : Integer); Var aux : Real; Begin If p < n Then ...
Manipulations élémentaires des tableaux sous MatLab VoirSommaire I. Stockage des tableaux II. L'indexation linéaire II.1. Accéder à un élément d'un tableau en utilisant l'indexation linéaire II.2. Passer d'une indexation à l'autre II.2.1. La fonction ind2sub II.2.2. La fonction sub2ind III. La...
Télécharger Tables multimédia VoirEn général les enfants ont tendance à ne pas vouloir étudier et les parents perdent parfois patience à leur apprendre. Peut-être qu’il est temps d’essayer quelque chose de plus pratique avec plus résultats. Tables multimédia donne la possibilité...
Transformations de XML avec XSLT VoirXSLT et XSL/FO XSL (eXtensible Stylesheet Language) possède deux composantes : XSLT, eXtensible Stylesheet Transformation XSL/FO, eXtensible Stylesheet formatting le langage de transformation des données (XSLT, eXtensible Stylesheet...
Tableaux HTML VoirUtilisation de tableaux Il est souvent utile de présenter des informations mieux structurées qu'avec des listes. Les tableaux permettent de les afficher en lignes et en colonnes. Les tableaux sont définis comme étant des suites de lignes. Un...
Javascript - l'objet Array VoirLes particularités de l'objet Array L'objet Array est un objet du noyau Javascript permettant de créer et de manipuler des tableaux. Voici la syntaxe à utiliser pour créer une variable tableau : var x = new Array(element1[, element2, ...]); Si...

1

Reivax962, le 11 jan 2007 à 16:04:45
  • +1

J'ai peut être une piste...

Mais pour ça, j'aurais une autre question...
Récupérer le 5e élément, ok : Element[position() = 5]
Récupérer un élément dont l'attribut groupe vaut "chose", ok : Element[@groupe="chose"].

Mais comment récupérer le 5e élément dont l'attribut vaut chose ??

Merci !

Xavier

Répondre à Reivax962

2

 Reivax962, le 11 jan 2007 à 18:39:36
  • +3

Bon, pour ceux que ça intéresse, j'ai fini par résoudre mon problème !

Voilà un exemple de document xml, et le code XSL correspondant.
D'abord l'XML

<sectionSite>
	<groupeSite Groupe="Radius" Ordre="5">
		<elementSite Nom="Login" Valeur="xxx"/>
		<elementSite Nom="Adresse IP fixe" Valeur="xxx"/>
		<elementSite Nom="ISDN ok" Valeur="Oui"/>
		<elementSite Nom="Liaison ADSL" Valeur="Non"/>
	</groupeSite>
	<groupeSite Groupe="Radius" Ordre="5">
		<elementSite Nom="Login" Valeur="xxx"/>
		<elementSite Nom="Adresse IP fixe" Valeur="xxx"/>
		<elementSite Nom="ISDN ok" Valeur="Oui"/>
		<elementSite Nom="Liaison ADSL" Valeur="Non"/>
	</groupeSite>
	<groupeSite Groupe="Collecte / Préselection" Ordre="6">
		<elementSite Nom="Numéro 9T" Valeur="xxx"/>
		<elementSite Nom="Service actif 9T" Valeur="Oui"/>
		<elementSite Nom="Statut collecte 9T" Valeur="ACTIVATION_OK"/>
		<elementSite Nom="Préselection active 9T" Valeur="Non"/>
	</groupeSite>
	<groupeSite Groupe="Collecte / Préselection" Ordre="6">
		<elementSite Nom="Numéro Colt" Valeur="xxx"/>
		<elementSite Nom="Service actif Colt" Valeur="Oui"/>
		<elementSite Nom="Statut collecte Colt" Valeur="ACTIVATION_OK"/>
		<elementSite Nom="Préselection active Colt" Valeur="Non"/>
		<elementSite Nom="Statut préselection Colt" Valeur="DEMANDE_A"/>
	</groupeSite>
	<groupeSite Groupe="Equipement" Ordre="7">
		<elementSite Nom="Nom" Valeur="xxx"/>
		<elementSite Nom="Numéro" Valeur="xxx"/>
		<elementSite Nom="IP" Valeur="xxx"/>
		<elementSite Nom="Nature" Valeur="Telephone"/>
		<elementSite Nom="Marque" Valeur="LG"/>
		<elementSite Nom="Modèle" Valeur="6830"/>
		<elementSite Nom="Description" Valeur="telephone IP"/>
	</groupeSite>
	<groupeSite Groupe="Equipement" Ordre="7">
		<elementSite Nom="Nom" Valeur="xxx"/>
		<elementSite Nom="Numéro" Valeur="xxx"/>
		<elementSite Nom="IP" Valeur="xxx"/>
		<elementSite Nom="Nature" Valeur="Telephone"/>
		<elementSite Nom="Marque" Valeur="LG"/>
		<elementSite Nom="Modèle" Valeur="6830"/>
		<elementSite Nom="Description" Valeur="telephone IP"/>
	</groupeSite>
Puis le XSL
<xsl:template match="/sectionSite">
	<xsl:if test="count(child::node()[@Groupe='Radius']) > 0">
		<table border="0" class="form" style="margin-bottom:20px;">
			<xsl:apply-templates select="child::node()[@Groupe='Radius']" mode="premiers_3col"/>
		</table>
	</xsl:if>
	<xsl:if test="count(child::node()[@Groupe='Collecte / Préselection']) > 0">
		<table border="0" class="form" style="margin-bottom:20px;">
			<xsl:apply-templates select="child::node()[@Groupe='Collecte / Préselection']" mode="premiers_3col"/>
		</table>
	</xsl:if>
	<xsl:if test="count(child::node()[@Groupe='Equipement']) > 0">
		<table border="0" class="form" style="margin-bottom:20px;">
			<xsl:apply-templates select="child::node()[@Groupe='Equipement']" mode="premiers_4col"/>
		</table>
	</xsl:if>
</xsl:template>
<xsl:template match="/sectionSite/groupeSite" mode="premiers_3col">
	<xsl:variable name="groupe"><xsl:value-of select="@Groupe" /></xsl:variable>
	<xsl:if test="(position() mod 3) = 1">
		<tr>
			<td nowrap="true" valign="top" class="formContenuToLeft" style="border-top-width:1px; border-top-style:solid; border-top-color:#000000;">
				<xsl:apply-templates select="node()"/>
			</td>
			<xsl:choose>
				<xsl:when test="following-sibling::groupeSite[1]">
					<xsl:apply-templates select="following-sibling::groupeSite[position()=1 and @Groupe=$groupe]"/>
				</xsl:when>
				<xsl:otherwise>
					<td>&#160;</td>
				</xsl:otherwise>
			</xsl:choose>
			<xsl:choose>
				<xsl:when test="following-sibling::groupeSite[2]">
					<xsl:apply-templates select="following-sibling::groupeSite[position()=2 and @Groupe=$groupe]"/>
				</xsl:when>
				<xsl:otherwise>
					<td>&#160;</td>
				</xsl:otherwise>
			</xsl:choose>
		</tr>
	</xsl:if>
</xsl:template>
	
<xsl:template match="/sectionSite/groupeSite" mode="premiers_4col">
	<xsl:variable name="groupe"><xsl:value-of select="@Groupe" /></xsl:variable>
	<xsl:if test="(position() mod 4) = 1">
		<tr>
			<td nowrap="true" valign="top" class="formContenuToLeft" style="border-top-width:1px; border-top-style:solid; border-top-color:#000000;">
				<xsl:apply-templates select="node()"/>
			</td>
			<xsl:choose>
				<xsl:when test="following-sibling::groupeSite[1]">
					<xsl:apply-templates select="following-sibling::groupeSite[position()=1 and @Groupe=$groupe]"/>
				</xsl:when>
				<xsl:otherwise>
					<td>&#160;</td>
				</xsl:otherwise>
			</xsl:choose>
			<xsl:choose>
				<xsl:when test="following-sibling::groupeSite[2]">
					<xsl:apply-templates select="following-sibling::groupeSite[position()=2 and @Groupe=$groupe]"/>
				</xsl:when>
				<xsl:otherwise>
					<td>&#160;</td>
				</xsl:otherwise>
			</xsl:choose>
			<xsl:choose>
					<xsl:when test="following-sibling::groupeSite[3]">
					<xsl:apply-templates select="following-sibling::groupeSite[position()=3 and @Groupe=$groupe]"/>
				</xsl:when>
				<xsl:otherwise>
					<td>&#160;</td>
				</xsl:otherwise>
			</xsl:choose>
		</tr>
	</xsl:if>
</xsl:template>
	
<xsl:template match="/sectionSite/groupeSite">
	<td nowrap="true" valign="top" class="formContenuToLeft" style="border-top-width:1px; border-top-style:solid; border-top-color:#000000;">
		<xsl:apply-templates select="child::node()" />
	</td>
</xsl:template>
	
<xsl:template match="/sectionSite/groupeSite/elementSite">
	<b><xsl:value-of select="@Nom" /> : </b>
	<xsl:value-of select="@Valeur" />
	<xsl:if test="@Nom='Adresse IP fixe'">
		<small>
			(<a href="telnet://{@Valeur}" target="_BLANK">telnet</a>) 
			(<a href="http://{@Valeur}" target="_BLANK">http</a>)
		</small>
	</xsl:if>
	<br />
</xsl:template>
Bon, y a quand même un défaut, c'est que je suis obligé de créer un template différent suivant que je veuille 3 ou 4 colonnes...

Enfin bon, le principe général reste clair : au lieu de s'occuper des <groupeSite> élément par élément, on va le faire ligne par ligne : on récupère donc les premiers de chaque ligne (position() mod N = 1 pour une ligne à N colonnes), et on place à la main les noeuds suivants pour compléter la ligne. Ce n'est pas vraiment très souple, mais bon...

Bref, voilà, quoi, c'est résolu ^^

Xavier

Répondre à Reivax962