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