[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] RE: Accessing multiple values of an attribute
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
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|