Re: [xsl] Find the Position Index of Elements‏‏

Subject: Re: [xsl] Find the Position Index of Elements‏‏
From: Alice Wei <elite.english@xxxxxxxxx>
Date: Sun, 13 Jun 2010 18:26:08 -0400
Right, I am not intending to use this in the xsl at all, and I am
trying to use this in VB.NET in ASP.
I am trying to come up with some way so I can figure out how to
extract the position node of the elements from my xml so I can use
them to use pagination.

I tried David's solution, and somehow that didn't work, it now gives
me this error on tokenizer issues, and I am not sure if what I trying
to do is even possible at all.

Alice

On Sun, Jun 13, 2010 at 6:14 PM, Philip Fearon <pgfearo@xxxxxxxxxxxxxx>
wrote:
> Though this is the xsl-list, you haven't mentioned XSLT, so this
> answer is just in case you wanted an XPath / .NET solution:
>
> XPath 1.0 as available natively in VB.NET can't return the sequence of
> atomic numbers you describe, it can only return a single value or a
> nodeset. If, however, you were using VB.NET with an XPath 2.0
> processor (such as Saxon.NET) you could simply use:
>
> for $rocksong in /music_songs/song[category = 'Rock'] return
> $rocksong/count(preceding-sibling::song) + 1
>
> Going back to XPath 1.0: you would first need to iterate through all
> the returned song elements returned by your expression and then, using
> another expression, evaluate the current song node position relative
> to previous song nodes:
>
> B  B  B  B  B  B count(./preceding-sibling::song)
>
> I've shown below sample code of how you would use the .NET
> XPathNavigator to work with the context node in this case. This sample
> is in C# but should be easy enough to convert to VB.Net.
>
> B  B  B  B  B  B XPathDocument xdoc = new
XPathDocument("c:\\test\\songs.xml");
>
> B  B  B  B  B  B XPathNavigator xnav = xdoc.CreateNavigator();
>
> B  B  B  B  B  B XPathExpression songsExpr =
> xnav.Compile("/music_songs/song[category='Rock']");
> B  B  B  B  B  B XPathExpression countSongsExpr =
> xnav.Compile("count(./preceding-sibling::song)");
>
> B  B  B  B  B  B XPathNodeIterator iterator =
> (XPathNodeIterator)xnav.Evaluate(songsExpr);
>
> B  B  B  B  B  B while(iterator.MoveNext())
> B  B  B  B  B  B {
> B  B  B  B  B  B  B  B XPathNavigator songNav =
> (XPathNavigator)iterator.Current.Clone();
> B  B  B  B  B  B  B  B double songPosition =
> (double)songNav.Evaluate(countSongsExpr) + 1;
> B  B  B  B  B  B }
>
> The above XPath 1.0 sample works, but hopefully this also shows how
> much simpler (and more readable) things would be with XPath 2.0
>
> Regards
> Phil Fearon
> http://qutoric.com/
>
> On Sun, Jun 13, 2010 at 8:43 PM, Alice Wei <elite.english@xxxxxxxxx> wrote:
>> Hi,
>>
>> I have an XML snippet as in the following:
>>
>> <music_songs>
>> B <song>
>> B  B <title>(I Just) Died In Your Arms</title>
>> B  B <category>Rock</category>
>> B  B <album>80 Popular Hits</album>
>> B  B <artist>Cutting Crew</artist>
>> B  B <date added="03-24-2009"/>
>> B </song>
>> B </music_songs>
>>
>> This is one of the songs out of categories I have in my xml file, and
>> currently I use XPath expression as in the following:
>> /music_songs/song[category='Rock' as an example to find all the songs
>> in the Rock category.
>>
>> I need to also be able to pull the position index of the song elements
>> that I pull from the above expression, and use that in VB.NET for
>> process. I tried using count(), position(), but they seem to be able
>> to detect, but they cannot give me a list like
>>
>> 1
>> 2
>> 3
>>
>> for the index id of the search list. Is there a particular expression
>> I need to use here?
>>
>> Thanks for your help.

Current Thread