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

Reply via email to