[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: For-each loop or recursion

Subject: Re: For-each loop or recursion
From: Oleg Konovalov <olegkon@xxxxxxxxx>
Date: Sun, 15 May 2005 23:48:05 -0400
fortran foreach
David,

Answering your questions:

> > I have the following data (leaves in parallel branches):
> > mystruct/myarray1[i]/myvar/var2 and
> > mystruct/myarray2[i]/myvar/var3
>
> It isn't clear what you mean by the myarray[i] construct, that is a
> legal XPath expression that selects all elements called myarray that
> have a child element called i. I suspect that isn't what you want,
> I could make some guesses as to what you do mean but in any case that
> presumably is not your data, but rather a sketch of part of your
> stylesheet accessing the data. You need to say what your input looks like.

To be very honest, I am not totally sure myself about myarray1[i].
As I said, that is not my code (author is long gone), and I am new to XSLT.
I am just trying to make enhancements. That is how that node is
accessed everywhere.
In fact, it is mostly myarray1[1] and myarray2[1],
what you can call "parallel branches".

>
> > I need to implement the find the first occurence of :
> > <xsl:if test="position() != last() and
> >   number(var2) = number(var2[position()+1]) and
> >   number(var3) = number(var3[position()+1])">
> >       <value-of select="position()">
> > </xsl:if>
>
> Again I'm struggling to guess what you mean here. You need to describe
> the transformation that you want to do, either in english or by posting a
> small (six line) example input and stating what result you want to get
> from that input.
>
> the above is syntactically legal Xpath but
> var2[position()+1] is short for var2[position()=position()+1]
> so selects the set of var2 elements for which the position is equal to
> one more than the position so this is the empty set.
> applying number() to that always produced NotaNumber. NaN is never = to
> any other value (including itself) so the two = tests in the expression
> will never be true so the xsl:if will never return anything.

I need to compare current and next values of the node var2 [and var3]
and find the first occurrence when var2[position()] = var2[next, i.e.
position()+1]
Are you saying that is impossible to do in XSLT ?
If not, how should I do it ?


> > 2) Will I be able to get a node from the parallel branch in for-each loop
?
> > Something like:
> > <xsl:for-each mystruct/myarray1[i]/myvar>
> >   <xsl:if test=" ...and number(../../myarray2[i]/myvar/var3) =
> > number((../../myarray2[i]/myvar/var3)[position()+1]) and...">
> >     <value-of select="position()">
> >   </xsl:if>
> > </xsl:for-each>)
> > I know it looks awful  :-(
> As in the other cases this is syntactically legal but probably not what
> you want to do, but it doesn't give us any indication of what you _do_
> want to do.

I want from inside for-each loop mystruct/myarray1[i]/myvar
[or does it require recursion?]
compare the values is the parallel branch,
of parallel "current" node ../../myarray2[i]/myvar/var3 and its "next node".
Again, where:
mystruct/myarray1[i]/myvar/var2 and
mystruct/myarray2[i]/myvar/var3


> > 3) Is there a way to somehow start the for-each loop
> > from position other than 1 ?
>
> for-each isn't looping over some counter like a Fortran DO loop, it is
> iterating over a set of nodes, position() reports the order in which the
> nodes are being processed so obviously it alwyas starts with
> position()=1 This position() value has no relationship with any position
> of the node in the document tree: you can select any nodes (and using
> xsl:sort) process them in any order.
> for example if your current node has 10 child elements called x and you
> go
> <xsl:for-each select="x[position()&gt;3]">
> then the first node processed will be the 4th x child, but position()
> will be equal to 1 in that first iteration.

Not sure about Fortran, I am from Java world.

Is there an easy way to find out the max value of the node (child elements)
without sorting it ?
The sequence of nodes I am dealing with is supposed to be in increasing
order,
but might repeat the particular node. So I am in fact looking for the
1st occurrence
of max  value in 2 branches to say "6 (max) or more" and not to
display the rest.
FYI: displaying the table with value rebates for particular product,
so now it looks like:

                    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

Since rebate1 and rebate2 are coming from totally different
database tables [and calculated based on totally different criteria],
they are put in different XML structures, but happen to be on the
same nesting level.

Do you understand what I am doing now ?

What is the easiest way to achieve it, via for-loop or recursion ?


Thank you.
Oleg.

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.