Bonjour,

Voila je suis un peu perdu j'aimerais dans mon html de sortie colorié une ligne sur 2 mais j'ai des "interligne" qui doivent être de la même couleur et je n'y arrive pas. Voici ma structure:

 <xsl:template match="Personal/Person">
<tr>
<xsl:if test="position() mod 2 =1">
<xsl:attribute name="bgcolor"><xsl:value-of select="$Gris"/></xsl:attribute>
</xsl:if>
<th align="right" valign="top" class="thb">
<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
</th>
</tr>
<xsl:for-each select="Funktion/Fkt">
<tr>
<xsl:if test="postion de Person et non de Fkt mod 2=1">
<xsl:attribute name="bgcolor"><xsl:value-of select="$Gris"/></xsl:attribute>
</xsl:if>
<th align="right" valign="top" class="thb">
<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
</th>
</tr>
</xsl:for-each>
</xsl:template>


L'exemple a biensur été tronqué mais le but est que dans le for-each se soit la position de person qui soit prise et non celle de Fkt.

J'ai essayé avec une variable mais ce ne marche pas car elle est hors de portée ou il n'est plus incrémenté car je l'incrémente dans le if.

Avez-vous une idée sur comment pourrais-je régler le problème?

Merci

Thierry
Modifié par virgul (21 Jun 2006 - 11:10)
Salut !

Essaye avec quelque chose comme ça (sans aucune garantie) :


<xsl:template match="Personal/Person">
     <tr>
          <xsl:if test="position() mod 2 =1">
               <xsl:attribute name="bgcolor"><xsl:value-of select="$Gris"/></xsl:attribute>
          </xsl:if>
          
          <th align="right" valign="top" class="thb">
               <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
          </th>
     </tr>


     <xsl:for-each select="Funktion/Fkt">
          <tr>
               <xsl:if test="count(preceding:: Personal/Person)+1 mod 2=1">

                    <xsl:attribute name="bgcolor"><xsl:value-of select="$Gris"/></xsl:attribute>

               </xsl:if>
               <th align="right" valign="top" class="thb">
                    <xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
               </th>
          </tr>
     </xsl:for-each>
</xsl:template>


Tiens moi au courant Smiley cligne

Edit : attention, il faut enlever l'espace après les deux : (et avant le Personal/Person), le forum affiche un smiley s'ils sont collés Smiley confus
Modifié par daitheflu (21 Jun 2006 - 13:41)
Bonjour,

Il doit suffire de définir une variable dans le template match="Personal/Person". Cette variable sera valable sur l'ensemble du template, et doit rester constante à l'intérieur du template.

La variable prendra une valeur différente à chaque nouvelle instanciation du template c'est à dire à chaque nouvelle Personal/Person rencontrée dans le document source. C'est justement ce qui répond à ton besoin semble-t-il.
Exemple:


<xsl:apply-templates select="node()" mode="toto"/>

<xsl:template match="node()[position() mod 2=0 ]" mode="toto">
......ligne couleur X
</xsl:template>

<xsl:template match="node()[position() mod 2=1 ]" mode="toto">
......ligne couleur X
</xsl:template>


Voilà cela fonctionne 100%.
Je me repette souvent.... laissez tombé les "for-each"
Bon courage
Smiley biggrin
Ok ben merci pour toutes ces réponses.

Je vais essayer la solution à Sylvain38 et je vous donne des nouvelles.

La solution à Xavier serait plus simple a appliqué mais bon je veux faire un truc en ordre.

Au faite y aurait-il une explication de pourquoi il faut abandonner le for-each? Merci

++

Thierry
Modifié par virgul (22 Jun 2006 - 14:15)
Comme sylvain38, j'ai déjà eu l'occasion de prêcher (dans le désert ?) pour l'usage des bonnes pratiques XSLT : ici, , et encore.

Pour des raisons de performance et de maintenabilité, il vaut mieux s'inscrire dans les bonnes pratiques :
- application de template (les plus génériques possible (éviter les templates nommés)
- utiliser la récursivité naturelle xslt
- parcourir l'arbre source de façon naturelle
Or for-each n'est pas un template, créé sa propre liste de noeuds courant (au lieu de la liste naturelle), empêche la récursivité implicite...
Désolé mais ca ne marche pas ton exemple sylvain car la position() est de nouveau par rapport a Fkt et non par rapport à la Person!


Que faut-il pour que ca marche? essayer celle de Xavier ?

Merci

Thierry

P.S. Désolé pour la réponse tardive mais j'ai pas eu le temps de le faire avant
Ah normal Smiley biggrin

L'exemple que je t'ai fourni et une approche correcte de ton probléme.
Elle doit te permettre de resoudre ton probléme et non de te donner la solution. Smiley cligne

Donne moi un exemple de code XML.
Je regarderais ce que je peux faire.

A+
Désolé du retard mais j'avais d'autre chose plus urgente à faire!

Oui je vois ce que tu veux dire mais si je recule au parent ca me fait pas mal de code à double ou alors je doit encore faire un call-template bref je suis un peu perdu alors j'accepte volontiers ton aide:

LE xml:


<ExtractList>
  <Extract Amt="170">    
   <Personal>
<Person Ein="1" loe="1" mut="1" seq="2" toCheck="0" valid="0">
        <Personalien Sexe="2" valid="0">
          <Name>Ankenbrand</Name>
          <Vorname>Thomas</Vorname>
          <Heimat BFS="230">Winterthur</Heimat>
          <Heimat BFS="114">Fischenthal</Heimat>
          <WohnOrt PLZ="9000">St. Gallen</WohnOrt>
          <PersDaten>Ankenbrand, Thomas, von Winterthur und Fischenthal, in St. Gallen</PersDaten>
        </Personalien>
        <Funktion>
          <Fkt FunkNr="610" valid="0">
            <func>Gesellschafter</func>
            <kurz>Gesellschafter</kurz>
            <ZB ZartNr="902">
              <sign>Einzelunterschrift</sign>
              <signKurz>EU</signKurz>
            </ZB>
          </Fkt>
          <Fkt FunkNr="614" valid="0">
            <func>Geschäftsführer</func>
            <kurz>Geschäftsführer</kurz>
          </Fkt>
<Fkt FunkNr="650" valid="1">
            <func>Liquidator</func>
            <kurz>Liquidator</kurz>
          </Fkt>
        </Funktion>
        <Garantie>
          <Summe Anzahl="1" Betrag="19000" Typ="4" Wert="19000">19000</Summe>
        </Garantie>
      </Person>
      <Person Ein="1" loe="1" mut="1" seq="3" toCheck="0" valid="0">
        <Personalien Sexe="1" valid="0">
          <Name>Ankenbrand</Name>
          <Vorname>Martina</Vorname>
          <Heimat BFS="230">Winterthur</Heimat>
          <Heimat BFS="3604">Vignogn</Heimat>
          <WohnOrt PLZ="9000">St. Gallen</WohnOrt>
          <PersDaten>Ankenbrand, Martina, von Winterthur, Fischenthal und Vignogn, in St. Gallen</PersDaten>
        </Personalien>
        <Funktion>
          <Fkt FunkNr="611" valid="0">
            <func>Gesellschafterin</func>
            <kurz>Gesellschafterin</kurz>
            <ZB ZartNr="902">
              <sign>Einzelunterschrift</sign>
              <signKurz>EU</signKurz>
            </ZB>
          </Fkt>
        </Funktion>
        <Garantie>
          <Summe Anzahl="1" Betrag="1000" Typ="4" Wert="1000">1000</Summe>
        </Garantie>
      </Person>
</Personal>
</Extract>
</ExtractList>


et le xsl est postez en premier! ca devient embêtant quand il y a trois fonction

le résultat escompté (dans l'exemple je t'ai ajouté une troisième fonction pour une personne afin que tu te rende compte)est :
http://zefix.powernet.ch/infopath/funkt.jpg

Merci beaucoup pour ton aide!

++

Thierry
Modifié par virgul (11 Jul 2006 - 11:49)
En faite je vais le repostez car il n'est pas complet:

<xsl:template match="Personal/Person">
		<tr>
			<xsl:if test="position() mod 2 =1">
				<xsl:attribute name="bgcolor"><xsl:value-of select="$Gris"/></xsl:attribute>
			</xsl:if>
			<th align="right" valign="top" class="thb">
			<font>
<xsl:choose>
<xsl:when test="@toCheck='1'">
<xsl:attribute name="color">#FF0000</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="color">#000000</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
				<xsl:choose>
					<xsl:when test="@Aenderung=0 or @Aenderung"/>
					<xsl:otherwise>
						<xsl:value-of select="@Ein"/>
					</xsl:otherwise>
				</xsl:choose>
				<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text></font>
			</th>
			<th align="right" valign="top" class="thb"><font>
<xsl:choose>
<xsl:when test="@toCheck='1'">
<xsl:attribute name="color">#FF0000</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="color">#000000</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
				<xsl:choose>
					<xsl:when test="@Aenderung=1">
						<xsl:value-of select="@Ein"/>
					</xsl:when>
					<xsl:otherwise/>
				</xsl:choose>
				<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text></font>
			</th>
			<th align="right" valign="top" class="thb">
			<font>
<xsl:choose>
<xsl:when test="@toCheck='1'">
<xsl:attribute name="color">#FF0000</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="color">#000000</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
				<xsl:if test="@loe!=0">
					<xsl:choose>
						<xsl:when test="@mut=1">
							<xsl:value-of select="@loe"/>m</xsl:when>
						<xsl:otherwise>
							<xsl:value-of select="@loe"/>
						</xsl:otherwise>
					</xsl:choose>
				</xsl:if>
				<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text></font>
			</th>
			<th class="thb" valign="top">
			<font>
<xsl:choose>
<xsl:when test="@toCheck='1'">
<xsl:attribute name="color">#FF0000</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="color">#000000</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
				<xsl:choose>
					<xsl:when test="Personalien[@valid=0]">
						<strike>
							<!--xsl:if test="Personalien/Name/@Prefix"><xsl:value-of select="Personalien/Name/@Prefix"/><xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text></xsl:if-->
							<xsl:value-of select="Personalien/PersDaten"/>
						</strike>
					</xsl:when>
					<xsl:otherwise>
						<!--xsl:if test="Personalien/Name/@Prefix"><xsl:value-of select="Personalien/Name/@Prefix"/><xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text></xsl:if-->
						<xsl:value-of select="Personalien/PersDaten"/>
					</xsl:otherwise>
				</xsl:choose>
				</font>
			</th>
			<th class="thb" valign="top"><font>
<xsl:choose>
<xsl:when test="@toCheck='1'">
<xsl:attribute name="color">#FF0000</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="color">#000000</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
				<xsl:choose>
					<xsl:when test="Funktion/Fkt[@valid=0]">
						<strike>
							<xsl:value-of select="Funktion/Fkt/func"/>
							
						</strike>
					</xsl:when>
					<xsl:otherwise>
						<xsl:value-of select="Funktion/Fkt/func"/>
					</xsl:otherwise>
				</xsl:choose>
				<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text></font>
			</th>
			<th valign="top"><font>
<xsl:choose>
<xsl:when test="@toCheck='1'">
<xsl:attribute name="color">#FF0000</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="color">#000000</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
				<xsl:choose>
					<xsl:when test="Funktion/Fkt[@valid=0]">
						<strike>
							<xsl:value-of select="concat(Funktion/Fkt[position()=1]/ZB/sign, ' ',Funktion/Fkt[position()=1]/ZB/extra)"/>
						</strike>
					</xsl:when>
					<xsl:otherwise>
						<xsl:value-of select="concat(Funktion/Fkt[position()=1]/ZB/sign, ' ',Funktion/Fkt[position()=1]/ZB/extra)"/>
					</xsl:otherwise>
				</xsl:choose>
				<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text></font>
			</th>
		</tr>
		<xsl:apply-templates select="Funktion/Fkt[position()!=1]" mode="toto"/></xsl:template>
<xsl:template match="Funktion/Fkt[position() mod 2=1]" mode="toto"><tr>
			
				<xsl:attribute name="bgcolor"><xsl:value-of select="$Gris"/></xsl:attribute>
			
			<th align="right" valign="top" class="thb">
				<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
			</th>
			<th align="right" valign="top" class="thb">
				<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
			</th>
			<th align="right" valign="top" class="thb">
				<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
			</th>
			<th class="thb" valign="top">
		<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
			</th>
			<th class="thb" valign="top"><font>
<xsl:choose>
<xsl:when test="../../@toCheck='1'">
<xsl:attribute name="color">#FF0000</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="color">#000000</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
				<xsl:choose>
					<xsl:when test="@valid=0">
						<strike>
							<xsl:value-of select="func"/>
							
						</strike>
					</xsl:when>
					<xsl:otherwise>
						<xsl:value-of select="func"/>
					</xsl:otherwise>
				</xsl:choose>
				<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text></font>
			</th>
			<th valign="top"><font>
<xsl:choose>
<xsl:when test="../../@toCheck='1'">
<xsl:attribute name="color">#FF0000</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="color">#000000</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
				<xsl:choose>
					<xsl:when test="@valid=0">
						<strike>
							<xsl:value-of select="concat(ZB/sign, ' ', ZB/extra)"/>
						</strike>
					</xsl:when>
					<xsl:otherwise>
						<xsl:value-of select="concat(ZB/sign, ' ',ZB/extra)"/>
					</xsl:otherwise>
				</xsl:choose>
				<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text></font>
			</th>
		</tr></xsl:template>
		
		<xsl:template match="Funktion/Fkt[position() mod 2=0 ]" mode="toto"><tr>
			<th align="right" valign="top" class="thb">
				<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
			</th>
			<th align="right" valign="top" class="thb">
				<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
			</th>
			<th align="right" valign="top" class="thb">
				<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
			</th>
			<th class="thb" valign="top">
		<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text>
			</th>
			<th class="thb" valign="top"><font>
<xsl:choose>
<xsl:when test="../../@toCheck='1'">
<xsl:attribute name="color">#FF0000</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="color">#000000</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
				<xsl:choose>
					<xsl:when test="@valid=0">
						<strike>
							<xsl:value-of select="func"/>
							
						</strike>
					</xsl:when>
					<xsl:otherwise>
						<xsl:value-of select="func"/>
					</xsl:otherwise>
				</xsl:choose>
				<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text></font>
			</th>
			<th valign="top"><font>
<xsl:choose>
<xsl:when test="../../@toCheck='1'">
<xsl:attribute name="color">#FF0000</xsl:attribute>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="color">#000000</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
				<xsl:choose>
					<xsl:when test="@valid=0">
						<strike>
							<xsl:value-of select="concat(ZB/sign, ' ', ZB/extra)"/>
						</strike>
					</xsl:when>
					<xsl:otherwise>
						<xsl:value-of select="concat(ZB/sign, ' ',ZB/extra)"/>
					</xsl:otherwise>
				</xsl:choose>
				<xsl:text disable-output-escaping="yes">&amp;nbsp;</xsl:text></font>
			</th>
		</tr></xsl:template>


Merci