From: Frédéric Laurent (fl@opikanoba.org)
Date: 01/12/2003 - 09:08
Selon Nadia.Payet@infineon.com:
>
> Bonjour,
>
> J'ai un document XML de la forme suivante :
>
> <track>
> <trackcmd> (26 fois)
> <message> (6 fois)
> <trackcmd> (25 fois)
> <message> (10 fois)
> ...
> <trackcmd> (20 fois)
> <message> (17 fois)
> </track>
>
> J'aimerais numéroter les messages de 1 à N (N nb de <message>) avec un
> document XSL et je n'y arrive pas.
> J'ai bien sûr essayé avec la fonction "position" mais comme je passe dans
> <trackcmd> entre chaque <message>, le compteur ne s'incrémente pas comme il
> faut.
> Aidez moi svp !
> Merci à tous
bonjour
Il suffit de bien choisir l'expression xpath qui construit votre
ensemble de noeuds. Pour ne construire qu'un ensemble ne contenant
que des éléments message, il faut faire un
<xsl:for-each select="/track/message">
ou un
<xsl:apply-templates select="/track/message">
ainsi, la fonction position() retournera la bonne information.
Avec le fichier xml
<track>
<trackcmd>track 1</trackcmd>
<message>message 1</message>
<message>message 2</message>
<message>message 3</message>
<trackcmd>track 2</trackcmd>
<trackcmd>track 3</trackcmd>
<trackcmd>track 4</trackcmd>
<trackcmd>track 5</trackcmd>
<message>message 4</message>
<message>message 5</message>
<message>message 6</message>
<trackcmd>track 6</trackcmd>
<trackcmd>track 7</trackcmd>
<message>message 7</message>
<message>message 8</message>
<message>message 9</message>
</track>
la feuille de style suivante
...
<xsl:template match="track">
<tracks><xsl:apply-templates select="/track/message"/></tracks>
</xsl:template>
<xsl:template match="message">
<message>
<xsl:value-of select="position()"/>
<xsl:text> : </xsl:text>
<xsl:apply-templates/>
</message>
</xsl:template>
...
retourne
<tracks>
<message>1 : message 1</message>
<message>2 : message 2</message>
<message>3 : message 3</message>
<message>4 : message 4</message>
<message>5 : message 5</message>
<message>6 : message 6</message>
<message>7 : message 7</message>
<message>8 : message 8</message>
<message>9 : message 9</message>
</tracks>
Vous pouvez également utilisez un for-each
<xsl:template match="track">
<tracks>
<xsl:for-each select="/track/message">
<message>
<xsl:value-of select="position()"/>
<xsl:text> : </xsl:text>
<xsl:apply-templates/>
</message>
</xsl:for-each>
</tracks>
</xsl:template>
ce qui donnera le meme résultat...
Enfin, avec l'élément XSLT number, vous pouvez formater votre numérotation
de façon plus fine
remplacez le
<xsl:value-of select="position()"/>
par
<xsl:number value="position()" format="1. "/>
et vous obtiendrez
...
<message>1. message 1</message>
...
Jettez un oeil sur une réponse sur position() donnée par
Eric van der Vlist, il n'y a pas si longtemps
http://xmlfr.org/listes/xml-tech/2003/11/0164.html
Elle parle du même problème
cordialement
--
XPath free testing software : http://lantern.sourceforge.net
Frédéric Laurent http://www.opikanoba.org
--
Devenez redacteur <XML>fr et contribuez au developpement du
xml francophone (http://xmlfr.org/infos/redacteurs/) !
Liste de diffusion "xml-tech@xmlfr.org" (http://xmlfr.org).
Cette liste est a votre disposition pour discuter en francais de
tout sujet technique lie a XML.
Pour resilier votre abonnement, envoyez un message contenant
la commande "unsubscribe" a xml-tech-request@xmlfr.org
(mailto:xml-tech-request@xmlfr.org?Subject=unsubscribe)
Archive générée par hypermail 2.1.3 le 28/06/2004 - 11:06 UTC
webmaster@xmlfr.org
|