Altova Mailing List Archives>Archive Index >microsoft.public.xsl Archive Home >Recent entries >Thread Prev - Re: Previous value in a for-each [Thread Next] Re: Previous value in a for-eachTo: NULL Date: 11/3/2004 11:09:00 PM position is a function.
You wouldn't do this in programming :
function test1() {
... code
}
function test2() {
... code
}
test1()=test2()
Cause it'd throw an error, probably in a browser something like
'cannot assign function to result'
Cheers - Neil
On Wed, 3 Nov 2004 10:59:03 -0800, "Jason Burr"
<JasonBurr@d...> wrote:
>I think what he was trying to say is this (if I'm wrong I hope he will
>correct me)
>
>postion() can be assigned or it can be evaluated but it can't do both at the
>same time.
>
>In other words
>
>1. You can ask position() what it's value is
>2. You can tell position() what it's value is
>3. You can't ask it what it is and then tell it what it is at the same time.
>
>By assigning a variable you are asking it first and then telling it later
>what it should be.
>
>The reason this seemed a wee bit nonsensical to me is that generally when
>programming you have the ability to assign a value from the same value.
>Because generally the statement to the right of a value assignment is
>evaluated prior to its assignment on the left.
>
>so in programming generally this is a perfectly acceptable thing to do:
>x = x + 1
>or
>myObjectValue = myObjectValue - 1
>because its being read more like
>
>n = (x + 1)
>x = n
>
>whereas with the predicate statement it is being read literally as
>x = x + 1
>which can never be evaluated
>
>I think that is is because it is opening position() to accept a value and
>therefore it has no value when requested after being opened for input. I'm
>sure this is somehow by design and a perfectly good reason for it exists.
>(late bound early bound language?)
>
>
>"johndoe@d..." wrote:
>
>> I have seen and used the <xsl:variable name="PrevPos"
>> select="position() - 1" /> through trial and error, but I have not really
>> understood why exactly this is. I read the explanation provided by Marrow
>> but it seems to have gone over my head.
>>
>>
>>
>> "Jason Burr" <JasonBurr@d...> wrote in message
>> news:DD97D787-424F-4D74-B742-C69F5084D333@m......
>> > Marrow,
>> >
>> > Thanks simply assigning variable worked (never tried that because of all
>> > the "no variable reassignment" griping)
>> >
>> > My thinking on the predicate was that the order of execution would be
>> >
>> > 1. evaluate value of the (current) position()-1
>> > 2. assign that value to position()
>> > 3. retrive the node given the assigned position
>> >
>> > I guess my thinking was that = doesn't evaluate the truth a statement such
>> > as
>> >
>> > x = x + 1
>> >
>> > But rather
>> >
>> > (newvalue of x <--- (x - 1))
>> >
>> > Anyway good stuff to know thanks again.
>> >
>> > "Marrow" wrote:
>> >
>> >> Hi Jason,
>> >>
>> >> > Not trying to accomplish any thing was just messing around and thought
>> >> that
>> >> > it might be a good way to check for the last record in a group during a
>> >> loop.
>> >> > Since I can't reassign variables and position() tells me where in a
>> >> > loop I
>> >> am
>> >> > and position() can also be used to specify a node to look up it seemed
>> >> (maybe
>> >> > foolishly) that this was an easy way to know if the current node and
>> >> previous
>> >> > node for a given value match.
>> >>
>> >> The position() function when used **outside** a predicate will give you
>> >> the
>> >> position within the currently processed node-set (e.g. that selected by a
>> >> @select on <xsl:apply-templates> or <xsl:for-each>). When the position()
>> >> function is used **within** a predicate then it ruturns the index of the
>> >> node within the nodes selected by the XPath expression to the left of the
>> >> predicate.
>> >>
>> >> Your problem remains...
>> >>
>> >> > <xsl:when test="/foo/bar[position()=position()-1]/@attrib">
>> >>
>> >> read the bit inside the [] predicate! ;)
>> >>
>> >> How can "position()=position()-1" ever evaluate to true??? It can't... x
>> >> can never equal (x - 1)... complete impossibility! ;)
>> >>
>> >> Maybe one of those position()'s is the position prior to the predicate?
>> >> In
>> >> which case you would need to store one to a variable first, e.g something
>> >> like...
>> >>
>> >> <xsl:for-each select="bar">
>> >> <xsl:variable name="curr-posn" select="position()"/>
>> >> <xsl:choose>
>> >> <xsl:when test="/foo/bar[position()=$curr-posn -1]/@attrib">
>> >> ...
>> >>
>> >> or even just calc the index, e.g.
>> >>
>> >> <xsl:for-each select="bar">
>> >> <xsl:variable name="prev-posn" select="position() - 1"/>
>> >> <xsl:choose>
>> >> <xsl:when test="/foo/bar[$prev-posn]/@attrib">
>> >> ...
>> >>
>> >> Cheers
>> >> Marrow
>> >>
>> >> "Jason Burr" <JasonBurr@d...> wrote in message
>> >> news:C68421B0-71EE-4519-B453-EEB0735C5504@m......
>> >> > Hey Marrow,
>> >> >
>> >> > Not trying to accomplish any thing was just messing around and thought
>> >> that
>> >> > it might be a good way to check for the last record in a group during a
>> >> loop.
>> >> > Since I can't reassign variables and position() tells me where in a
>> >> > loop I
>> >> am
>> >> > and position() can also be used to specify a node to look up it seemed
>> >> (maybe
>> >> > foolishly) that this was an easy way to know if the current node and
>> >> previous
>> >> > node for a given value match. I am aware of Muenchian (you may have
>> >> > helped
>> >> me
>> >> > out with that).
>> >> >
>> >> > Anyway the context of that example would have been in
>> >> >
>> >> > <foo>
>> >> > <bar attrib='test'>
>> >> > <bar attrib='test'>
>> >> > <bar attrib='test2'>
>> >> > </foo>
>> >> >
>> >> > <xsl:for-each select="bar">
>> >> > <xsl:choose>
>> >> > <xsl:when test="/foo/bar[position()=position()-1]/@attrib">
>> >> > <xsl:value-of select="@attrib"/>
>> >> > </xsl:when>
>> >> > <xsl:otherwise>
>> >> > <xsl:value-of select="@attrib"/> end of group
>> >> > </xsl:otherwise>
>> >> > </xsl:choose>
>> >> > </xsl:for-each>
>> >> >
>> >> > Result expected
>> >> >
>> >> > test
>> >> > test end of group
>> >> > test2
>> >> >
>> >> > Clearly I didn't mess with the keys or anything for grouping but this
>> >> would
>> >> > work if the xml was ordered or if using the Muenchian Technique. (that
>> >> > is
>> >> if
>> >> > it evaluated like it does when using value-of)
>> >> >
>> >> > As far as it evaluating to nothing thats not completely true becuase if
>> >> > I
>> >> > hard code in the value of the position
>> >> >
>> >> > <xsl:value-of select="/foo/bar[position()=3]/@attrib"/>
>> >> >
>> >> > The the result would be
>> >> >
>> >> > test2
>> >> >
>> >> > and if I do
>> >> >
>> >> > <xsl:value-of select="position()-1"/>
>> >> >
>> >> > I would get
>> >> >
>> >> > 0
>> >> > 1
>> >> > 2
>> >> >
>> >> > So my general question was why would that not evaluate to the value of
>> >> > the
>> >> > node (which does exist) and return the value requested. Further if
>> >> > there
>> >> is
>> >> > no way for this to work then is there another way to evaluate the same
>> >> thing
>> >> > (the previous node processed in a for-each)
>> >> >
>> >> > Thanks,
>> >> >
>> >> > Jason
>> >> >
>> >> >
>> >> >
>> >> > "Marrow" wrote:
>> >> >
>> >> > > Hi Jason,
>> >> > >
>> >> > > > But that this never returns a result
>> >> > > >
>> >> > > > <xsl:value-of select="/foo/bar[position()=position()-1]/@attrib"/>
>> >> > >
>> >> > > Of course it won't ever return anything... the predicate []
>> >> > > expression
>> >> can
>> >> > > never evalaute to true.
>> >> > >
>> >> > > > What I want to do here is look at the last record in a loop to see
>> >> > > > if
>> >> I am
>> >> > > > at the end of a grouping (begininig of the next actually)
>> >> > >
>> >> > > Based on what you have described so far (but not seeing more of the
>> >> > > XSLT
>> >> and
>> >> > > XML) I'd say it'is unlikely that your current method of doing
>> >> > > grouping
>> >> will
>> >> > > work. There are a couple of ways of doing grouping in XSLT 1.0 - the
>> >> > > Muenchian Technique and preceding-sibling technique. I'm sure if you
>> >> post
>> >> > > an example of what your are trying to do someone will be able to show
>> >> you
>> >> > > how to do these.
>> >> > >
>> >> > > Cheers
>> >> > > Marrow
>> >> > > http://www.marrowsoft.com - home of Xselerator (XSLT IDE and
>> >> > > debugger)
>> >> > > http://www.topxml.com/Xselerator
>> >> > >
>> >> > >
>> >> > > "Jason Burr" <JasonBurr@d...> wrote in message
>> >> > > news:3CEE074F-AD95-4124-ADD2-8DB46106D9BA@m......
>> >> > > > Can someone explain why doing this writes a number one less than
>> >> > > > the
>> >> > > current
>> >> > > > position.
>> >> > > >
>> >> > > > <xsl:value-of select="position()-1"/>
>> >> > > >
>> >> > > > Doing this will display a specific positions value
>> >> > > >
>> >> > > > <xsl:value-of select="/foo/bar[position()=3]/@attrib"/>
>> >> > > >
>> >> > > > But that this never returns a result
>> >> > > >
>> >> > > > <xsl:value-of select="/foo/bar[position()=position()-1]/@attrib"/>
>> >> > > >
>> >> > > > What I want to do here is look at the last record in a loop to see
>> >> > > > if
>> >> I am
>> >> > > > at the end of a grouping (begininig of the next actually)
>> >> > > >
>> >> > >
>> >> > >
>> >> > >
>> >>
>> >>
>> >>
>>
>>
>>
| ||||||
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | Mobile | Full Site | |||
|
