Subject: Re: [xsl] Iterating over values in a table of data From: "andrew welch" <andrew.j.welch@xxxxxxxxx> Date: Wed, 7 Jun 2006 10:30:11 +0100 |
I'm trying to transform some XML which is supposed to act as an iterator/repeat statement without much success at the moment. I was wondering if anyone had some advice about the best way to approach this sort of problem. For example, my source XML looks a bit like the following:
<input> <!-- This is a table of lookup values. --> <data> <item> <value>one</value> </item> <item> <value>two</value> </item> <item> <value>three</value> </item> </data> <!-- This node needs to be repeatedly transformed for each input data item --> <repeat> Item <value-of name="value"/> is in position <position-of name="value"/> </repeat> </input>
The desired output is of the following format:
<output> <item>Item one is in position 1</item> <item>Item two is in position 2</item> <item>Item three is in position 3</item> </output>
The intention is that when a <repeat> node is transformed it will look up the value of the next item in the data table and output its value and also its position in the data table. This will need to be repeated for each data item.
I don't have a restriction on me regarding the version of XSLT I can use, so an XSLT 2.0 specific would be ok, although I would prefer a solution that does not use any processor specific extensions.
Has anyone got any advice on or solutions for this class of problem? Thanks.
You win todays prize for nasty XML - its looks like the XML designed with processing in mind, rather than just describing the data, and this has backfired because its reasonably involved to achieve what you are after.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/"> <output> <xsl:apply-templates select="input/repeat"/> </output> </xsl:template>
<xsl:template match="repeat"> <xsl:variable name="this" select="."/> <xsl:for-each select="/input/data/item"> <item> <xsl:variable name="value" select="value"/> <xsl:variable name="pos" select="position()"/> <xsl:apply-templates select="$this/node()"> <xsl:with-param name="value" select="$value"/> <xsl:with-param name="pos" select="$pos"/> </xsl:apply-templates> </item> </xsl:for-each> </xsl:template>
<xsl:template match="value-of"> <xsl:param name="value"/> <xsl:value-of select="$value"/> </xsl:template>
<xsl:template match="position-of"> <xsl:param name="pos"/> <xsl:value-of select="$pos"/> </xsl:template>
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] Iterating over values in , Michael Kay | Thread | Re: [xsl] Iterating over values in , Neil Crofts |
RE: [xsl] Iterating over values in , Michael Kay | Date | Re: [xsl] Iterating over values in , Mukul Gandhi |
Month |