Subject: RE: [xsl] Accessing multiple values of an attribute From: "Ben Robb" <Ben@xxxxxxxxxx> Date: Tue, 1 Oct 2002 18:25:57 +0100 |
If you can possibly change your XML it would help: <Table> <stripes> <stripe>blue</stripe> <stripe>red</stripe> etc This would mean that you could do this: ==================================== <xsl:template match="Boxrow"> <xsl:variable name="colorSelect" select="((position() -1) mod number($numStripes) + 1)"/> <tr><td bgcolor="{/Table/stripes/stripe[$colorSelect]}"> <xsl:apply-templates /> </td></tr> </xsl:template> ==================================== As you will see, this is a lot easier than the problem you have. Apart from that (if you can't change it), you were on the right lines when you were talking about using the xpath string functions to find the total number for your mod and the values. There isn't really an easier way, I'm afraid. Firstly, the total number of colours is given by "$t", which is built using a recursive function: ==================================== <xsl:variable name="t"> <xsl:call-template name="getTotal"> <xsl:with-param name="s" select="normalize-space(/Table/@stripes)"/> <xsl:with-param name="x" select="'1'"/> </xsl:call-template> </xsl:variable> <xsl:template name="getTotal"> <xsl:param name="s"/> <xsl:param name="x"/> <xsl:choose> <xsl:when test="contains($s, ' ')"> <xsl:call-template name="getTotal"> <xsl:with-param name="s" select="substring-after($s,' ')"/> <xsl:with-param name="x" select="$x + 1"/> </xsl:call-template> </xsl:when> <xsl:otherwise><xsl:value-of select="$x"/></xsl:otherwise> </xsl:choose> </xsl:template> ==================================== Secondly, to actually get the colour you want, you need to call another recursive template like this (from within the Boxrow template): ==================================== <xsl:template match="Boxrow"> <xsl:variable name="mybgcolor"> <xsl:call-template name="getColor"> <xsl:with-param name="x" select="((position() - 1) mod number($t) )"/> <xsl:with-param name="s" select="normalize-space(/Table/@stripes)"/> </xsl:call-template> </xsl:variable> <tr> <td bgcolor="{normalize-space($mybgcolor)}"> <xsl:apply-templates /> </td></tr> </xsl:template> <xsl:template name="getColor"> <xsl:param name="x" /> <xsl:param name="s"/> <xsl:choose> <xsl:when test="number($x) > 0"> <xsl:call-template name="getColor"> <xsl:with-param name="x" select="number($x) - 1"/> <xsl:with-param name="s" select="substring-after($s,' ')"/> </xsl:call-template> </xsl:when> <xsl:otherwise><xsl:value-of select="substring-before(concat($s, ' ') , ' ')"/></xsl:otherwise> </xsl:choose> </xsl:template> ==================================== Hope this helps, Ben XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] Accessing multiple values, Michael Kay | Thread | RE: [xsl] Accessing multiple values, Clifford, Karen |
Re: [xsl] modulus operator, David Carlisle | Date | [xsl] Re: Accessing multiple values, Dimitre Novatchev |
Month |