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

Subject: Re: [xsl] Find the Position Index of Elements‏‏
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Sun, 13 Jun 2010 16:50:03 -0700
On Sun, Jun 13, 2010 at 4:15 PM, Alice Wei <elite.english@xxxxxxxxx> wrote:
> Hi, Mike:
> B 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
> results.
> Is this possible?

You still haven't defined what you understand by "position" --
relative to what and in what node list? Providing a very specific
example is really needed.

Dimitre Novatchev
Truly great madness cannot be achieved without significant intelligence.
To invent, you need a good imagination and a pile of junk
Never fight an inanimate object
You've achieved success in your field when you don't know whether what
you're doing is work or play

> Alice
> 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