Re: [xsl] Iterating over values in a table of data

Subject: Re: [xsl] Iterating over values in a table of data
From: "Mukul Gandhi" <gandhi.mukul@xxxxxxxxx>
Date: Wed, 7 Jun 2006 15:10:16 +0530
Here is another XSLT 1.0 solution:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

<xsl:template match="/input">
   <output>
     <xsl:for-each select="data/item">
       <xsl:apply-templates select="../following-sibling::repeat">
         <xsl:with-param name="item" select="." />
         <xsl:with-param name="position" select="position()" />
       </xsl:apply-templates>
     </xsl:for-each>
   </output>
</xsl:template>

<xsl:template match="repeat">
   <xsl:param name="item"/>
   <xsl:param name="position"/>

   <item>
     <xsl:for-each select="node()">
       <xsl:choose>
         <xsl:when test="local-name() = 'value-of'">
           <xsl:value-of select="$item/value" />
         </xsl:when>
         <xsl:when test="local-name() = 'position-of'">
           <xsl:value-of select="$position" />
         </xsl:when>
         <xsl:otherwise>
           <xsl:copy-of select="." />
         </xsl:otherwise>
       </xsl:choose>
     </xsl:for-each>
   </item>

</xsl:template>

</xsl:stylesheet>

Regards,
Mukul

On 6/7/06, Neil Crofts <neil.crofts@xxxxxxxxx> wrote:
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.

Current Thread