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 19:15:06 -0400
Hi, Mike:

  I want the position of the position of the searched result. For
example, when I did /music_songs/song[category='Rock'][position()<11],
I get the first 10 songs in the searched list, and I am wondering if
it is possible that I could just find out the position of the
individual xml nodes that get pulled from the search. I would like to
use that number and set it dynamically to set the pagination of

Is this possible?


Does this make sense?

On Sun, Jun 13, 2010 at 6:58 PM, Michael Kay <mike@xxxxxxxxxxxx> wrote:
> On 13/06/2010 23:26, Alice Wei wrote:
>> 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.
> It seems you want an XPath 1.0 solution and David gave you an XPath 2.0
> solution.
> As for me, I don't think you've explained your requirement. You talk about
> wanting the "position index" or the "index id" of the elements you
> but I don't know what these terms mean. Do you want their position in the
> source tree, or their position in the list of retrieved elements?
> Michael Kay
> Saxonica
>> Alice
>> On Sun, Jun 13, 2010 at 6:14 PM, Philip Fearon<pgfearo@xxxxxxxxxxxxxx>
>> B 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
>>> 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
>>> On Sun, Jun 13, 2010 at 8:43 PM, Alice Wei<elite.english@xxxxxxxxx>
>>> B 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.

Alice Wei, MIS

Master of Information Science
Indiana University Bloomington

Current Thread