Dmitri, Thanks for the tip. It works! Our wrapper object's toString() method does indeed return the integer value as a String.
So now we use: "$map/dataMap/Foo/Bar[number($map/dataMap/Foo/Count[1])]" Behold, the power of XPath! :) Thanks again for your help. Steve Pannier Jacada, Inc. (763) 201-0002 Ext. 219 [EMAIL PROTECTED] http://www.jacada.com > Steve, > > Here's another option: > > "$map/dataMap/Foo/Bar[number($map/dataMap/Foo/Count)]" > > The "number" function will first convert the value to string and then > to number. So, as long as your custom object's toString() method > returns the integer content, this should work. > > - Dmitri > > > --- Steve Pannier <[EMAIL PROTECTED]> wrote: > > > > Dmitri, > > > > Thanks for the reply. This explains a lot of what we've been seeing. > > I tried your suggestion #2 (use "$map/dataMap/Foo/Count[1]" as the > > predicate) with my test program and it works. > > > > Unfortunately, the data in our application is customized so that all > > value > > objects within the map are wrapped inside a custom class. So using > > $map/dataMap/Foo/Count[1] for the predicate will still fail to give > > the > > desired results, since the Integer object it represents is wrapped in > > another class. (This custom way of storing our data in maps was an > > area of concern for us when we started using XPath.) And, > > unfortunately, > > your suggestion #1 (put a number in the map instead of the list) is > > not > > an option. > > > > I'll have to chew on this for awhile. I'm not sure what we can do, > > other > > than pre-parse the expression and replace "predicates" with their > > true > > integer values before evaluating the expression itself. > > > > Thanks again for clearing this up. > > > > Steve Pannier > > Jacada, Inc. > > (763) 201-0002 Ext. 219 > > [EMAIL PROTECTED] > > http://www.jacada.com > > > > > > > Steve, > > > > > > The explanation for the seemingly inconsistent behavior of JXPath > > is > > > quite simple. > > > > > > The value for the key "Count" in your example is not really an > > integer, > > > but a list containing an integer. That makes a difference. > > According > > > to the XPath specification, the predicate (the expression in > > brackets) > > > is used differently for different types. If the value of the > > > expression is a number, it is used as an index. If it is not a > > number, > > > it is converted to a boolean. The nodes for which it evaluates to > > true > > > are included in the resulting collection. In our case the value of > > the > > > expression is a non-empty list, so it evaluates to true for every > > > element of the collection. This is why every element is included in > > the > > > resulting list. > > > > > > There are two solutions to the problem: > > > > > > 1. Put a number in the map, instead of a list > > > 2. Change the xpath like this: > > > "$map/dataMap/Foo/Bar[$map/dataMap/Foo/Count[1]]". > > > > > > I hope this helps. > > > > > > - Dmitri > > > > > > > > > > > -- > > To unsubscribe, e-mail: > > <mailto:[EMAIL PROTECTED]> > > For additional commands, e-mail: > > <mailto:[EMAIL PROTECTED]> > > > > > __________________________________________________ > Do you Yahoo!? > Yahoo! Mail Plus - Powerful. Affordable. Sign up now. > http://mailplus.yahoo.com > > -- > To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> > For additional commands, e-mail: <mailto:[EMAIL PROTECTED]> > > -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
