| Subject: RE: [xsl] for-each loop question From: "Khorasani, Houman" <Houman.Khorasani@xxxxxxxxxxxx> Date: Mon, 3 Apr 2006 12:54:27 +0100 | 
Hi Andrew et al,
I solved one issue like you said in a recursive way:
Input XML:
----------
<RetainedProduct>
                <Product Quantity="2" Code="A56390"/>
                <Product Quantity="3" Code="A70978"/>
</RetainedProduct>
Main template:
------------------
<xsl:template name="mainTemplate">
   <xsl:variable name="ProductCount"
select="count(RetainedProduct/Product)"/>
   <xsl:call-template name="productTemplate ">
     <xsl:with-param name="ProductCount" select="$ProductCount"/>
</xsl:call-template>
ProductTemplate:
------------------
<xsl:template name="productTemplate">
	<xsl:param name="ProductCount"/>
	<xsl:variable name="Quantity" select="*/Product/@Quantity" />
      <xsl:if test="$ProductCount >: 0">
        <xsl:for-each select="*/Product"
	    <xsl:call-template name="genericMapping">
	      <xsl:with-param name="quantity" select="$Quantity"/>
	    </xsl:call-template>
	  </xsl:for-each>
	</xsl:if>
</xsl:template>
GenericMapping template (Recursive):
-------------------
<xsl:template name="genericMapping">
       <xsl:param name="quantity"/>
       ...
       <xsl:call-template name="genericMapping">
          <xsl:with-param name="quantity" select="$quantity - 1"/>
	 </xsl:call-template>
</xsl:template>
Description:
-------------
- The main Template shall calculate the amount of the products within
the input file and send it as a parameter to the ProductTemplate.
- ProductTemplate extracts the quantity attribute of the first product
and within the for-each loop it will send it as a parameter to the
GenericMapping template.
- The GenericMapping template does a loop according to its quantity for
the first product.
Problem:
---------
Coming back to ProductTemplate the for-each can not continue once the
GenericMapping template had been called.  So how can I point to the next
product in this case for calling the GenericMapping tamplate?
I hope you know what I mean ;)
Many thanks
Houman
-----Original Message-----
From: andrew welch [mailto:andrew.j.welch@xxxxxxxxx]
Sent: 31 March 2006 12:21
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: Re: [xsl] for-each loop question
No, as the context is a single <Product> node...
Doing what you are after is simple is XSLT 2.0, you could just use
select="1 to $quantity".
In 1.0 it's a lot harder, you will need to write a recursive named
template that calls itself decrementing the count with each call, or
use the Piez 'hack' of select="$someElementList[position() <= 5]"
As you haven't said if you can use 2.0 or not, I won't expand on the
1.0 solutions until then :)
cheers
andrew
| Current Thread | 
|---|
| 
 | 
| <- Previous | Index | Next -> | 
|---|---|---|
| Re: [xsl] for-each loop question, Mukul Gandhi | Thread | Re: [xsl] for-each loop question, David Carlisle | 
| RE: [xsl] xslt 2.0 calendar, Michael Kay | Date | Re: [xsl] xslt 2.0 calendar, David Carlisle | 
| Month |