Flux rss
Collection CommentCaMarche.net
Rechercher : dans
Par : Mots clés Nom d'utilisateur
Messages sans réponse

[XSLT] Boucles et tableaux...

Reivax962, le jeudi 11 janvier 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

1

Reivax962, le jeudi 11 janvier 2007 à 16:04:45
  • +2

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 jeudi 11 janvier 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
[php] boucle sur un tableau Bonjour ou Bonsoir, J'aimerai savoir comment faire une boucle sur toutes les valeurs de mon tableau en PHP. Merci. Exemple : $tab = array("err","fdf"); while(???) { } JSS.merci www.commentcamarche.net/forum/affich-764392-php-boucle-sur-un-tableau
XSLT - boucle et variable Bonjour, Je dois transformer un fichier XML en un autre fichier XML à l'aide de XSLT. Dans mon fichier XML d'origine, j'ai un élément qui peut-être répété plusieur fois à la suite. Ce que je veux faire c'est garder uniquement la première occurence non... www.commentcamarche.net/forum/affich-5225759-xslt-boucle-et-variable
Boucle JAVA [newbie] Bonjour à tous et à toutes, je suis une lycéenne et je m'intéresse depuis peu au language de programmation Java, je bloque sur les boucles + tableau, public class boucle { static String tab[] = {"lundi", "mardi", "mercredi", "jeudi", "vendredi"};... www.commentcamarche.net/forum/affich-4843470-boucle-java-newbie
Trier un tableau sans utiliser la fonction sortTrier 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... www.commentcamarche.net/faq/sujet-7685-trier-un-tableau-sans-utiliser-la-fonction-sort
Manipulations élémentaires des tableaux sous MatLabSommaire 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... www.commentcamarche.net/faq/sujet-11091-manipulations-elementaires-des-tableaux-sous-matlab
Tablet PC : pour les nomades pressésQu'est-ce qu'une Tablet PC ? Plus ergonomique et performante que le PDA, la Tablet PC fait partie de la catégorie des ordinateurs ultraportables. Son écran tactile utilise la reconnaissance manuscrite ou orale, et intègre ou non un clavier... www.commentcamarche.net/faq/sujet-15217-tablet-pc-pour-les-nomades-presses
[ C ] Tables de multiplication (Résolu)Salut à tous.... Je suis entraint de faire des exercices en C et je bug sur un (enfin pour l'instant il n'y a que un), Il est question d'afficher les tables de multiplication de 1 à 9 en utilisant les boucle... J'ai pas mal réfléchis, masi je ne... www.commentcamarche.net/forum/affich-2982657-c-tables-de-multiplication
INSERT INTO dans une seule table (en boucle)Bonjour, Mon problème est sûrement déjà arrivé, mais quand je fais une recherche je trouve plein de sujet mais je n'arrive pas souvent à comprendre, ou alors ça ne fonctionne pas >< Donc j'expose mon problème: J'ai une table qui s'appelle Droplist,... www.commentcamarche.net/forum/affich-11885979-insert-into-dans-une-seule-table-en-boucle
Affectation en boucle de variables dans un tableauSalut à tous! J'ai un petit souci avec une application qui m'a été demandée de faire... Voici: Je dois faire un panier pour un site machand. L'ennui c'est que l'article est identifié au nom du client. Je veux donc créer un tableau $nom pour y affecter... www.commentcamarche.net/forum/affich-7522038-affectation-en-boucle-de-variables-dans-un-tableau
Télécharger Tables multimédia En 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é... www.commentcamarche.net/telecharger/telecharger-34055970-tables-multimedia
Tableaux HTMLUtilisation 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... www.commentcamarche.net/contents/html/htmltable.php3
SQL - Modification de tableModification de table Il est possible de supprimer une table grâce à la clause DROP, il existe aussi des commandes moins extrêmes permettant L'ajout de colonnes La modification de colonnes La suppression de colonnes Enfin, il est possible... www.commentcamarche.net/contents/sql/sqldrop.php3
Javascript - Les tableauxIntroduction à la notion de tableau Les variables de Javascript ne permettent de stocker qu'une seule donnée à la fois. Or, étant donné qu'il est souvent utile de manipuler de nombreuses données, le concept de variable se révéle parfois... www.commentcamarche.net/contents/javascript/jstab.php3