xsl-list
[Top] [All Lists]

Re: For-each loop or recursion

2005-05-16 08:27:47
Aron,

Existing code is very complex - big Cocoon project 
(and I started using XSLT 2 weeks ago, but have lots of experience in
Java/C/C++),
so I tried to keep concentrated on what I am doing: 
creating 2 templates to calculate the number of the first
column to be displayed [first non-zero on either rebate1 and rebate2]
and the last one [first occurrence of max number in either rebate1 or rebate2]



                        1    2   3   4  5   6    7   8   9  10  11  12
13 (sales volume)
rebate1(%)     0   0   1   2   3   4    5   6   7   8    8    8    8
rebate2(%)     0   1   2   3   4   5    6   7   9   10  11  11  11

Need it be dynamically trimmed to display:

                        2   3   4  5   6    7   8   9  10  "11 or more"
rebate1(%)     0   1   2   3   4    5   6   7   8    8
rebate2(%)     1   2   3   4   5    6   7   9   10  11

And var2 is rebate1, var3 is rebate2

So if it makes it any easier, we can call it
mystruct/myarray1[1]/myvar/rebate1 and
mystruct/myarray2[1]/myvar/rebate2

At this point I am interested in how to implement algorithms in XSLT:
a) find out first non-zero on either rebate1 and rebate2
b) find out first occurrence of max number in either rebate1 or rebate2

So back to my questions:
1) How do I get a position of last occurrence of min ?

1a) Can I scan using for-each loop from the end of the sequence
to the beginning ?

2) OK, lets try to get a position of the first occurrence when var2 = max node.
What would be a correct ?

<xsl:for-each select=mystruct/myarray1[1]/myvar>
 <xsl:if select="rebate1=*[last()]">
   <xsl:value-of select="position()">
 </xsl:if>
</xsl:for-each>

3) Expanding 2 for the rebate2 (var3) for the values from another
(parallel) branch,
would that work ?

<xsl:for-each select=mystruct/myarray1[1]/myvar>
 <xsl:if select="rebate1=*[last()] and 
     ../../../myarray2[1]/myvar/rebate2=*[last()]">
   <xsl:value-of select="position()">
 </xsl:if>
</xsl:for-each>

I think, that second *[last()] is wrong, 
I have to get a max of the rebate2 (second sequence)
before that for-each loop. 

3a) Can I calculate max of rebate2 like:
<xsl:variable name="max2"
select="mystruct/myarray2[1]/myvar/rebate2[position()=last()]">
Is that the right way of assigning *[last()] to a variable ?


All that is based on the assumption that rebate1 and rebate2 sequences are 
already in ascending order.


Thank you,
Oleg.


On 5/16/05, Aron Bock <aronbock(_at_)hotmail(_dot_)com> wrote:
Oleg, please do really consider posting a sample of your XML; if your actual
XML is too verbose, make up a 5-liner that conceptually represents what you
want to do.  And, no, you likely don't need loops or recursion.

I wasn't going to post after *my* response with made-up data describing
accessing sibling values, but figured I would now even just to point out
that else, as you've seen, this can be slow going.

Regards,

--A

From: Oleg Konovalov <olegkon(_at_)gmail(_dot_)com>
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] For-each loop or recursion
Date: Mon, 16 May 2005 09:41:37 -0400

How do I get a position of last occurrence of min ?

Do I have to use recursion?
Can I scan using for-each from the end of the sequence
to the beginning ?

_________________________________________________________________
Is your PC infected? Get a FREE online computer virus scan from McAfee(r)
Security. http://clinic.mcafee.com/clinic/ibuy/campaign.asp?cid=3963


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



<Prev in Thread] Current Thread [Next in Thread>