- From: Gareth Reakes <gareth@decisionsoft.com>
- Date: Wed, 27 Aug 2003 15:04:40 +0100 (BST)
- To: Ray Whitmer <ray@xmission.com>
- Cc: Joseph Kesselman <keshlam@us.ibm.com>, "www-dom@w3.org" <www-dom@w3.org>
Hi,
> XPath2Sequence
>
> and
>
> XPath2Value
Is XPath2Value the same as "item" in the specs? If so this sounds
reasonable to me. I would place the convenience casting methods in this
Item class. Our item goes something like this (note I have promoted a
method from one level lower in our hierarchy for simplicity)
Item {
// not a casting method, but a serialisation method
asString();
//cast to anything
Item castAs(DOMString uri, DOMString name);
//self explanatory
boolean isNode();
//convenience methods to primitive types here
//we do not use these as we have classes representing the data types
//- these are derived from Item
...
};
As to what this adds to the XPath2Result method, I would say 2 things:
i) The ability the set the "context node" to an item (although we then
need some way of constucting them)
ii) The ability for implementors to provide a full hierarchy if they
desire. We have all the classes available and can provide them. It does
not make sense for us to limit this.
> Even with XPath2, it seems to me it would force significant additional
> allocation. As written today, there is nothing in the API that forces
> any additional allocations of objects defined by the API -- the same
> result object can be used for the sequences and the values within the
> sequences. I do not consider this a big deal, but there have been a
> number of implementers giving feedback who do care about it, which is
> why the 1.0 result object looks like it does today.
I don't see any more allocation for us. We would make our item implement
whatever interface was specified and just return a pointer to the
requested item from the sequence.
> It also may force another level of indirection for users, which may
> require the user to set up a variable to hold the resulting value object
> while he accesses multiple firlds of it. In Java, given the current
> requirement to cast the result object, this heaps more indirection on
> the user.
//note - very rough code
Access multiple fields using the XPath2Result way
Access multiple fields using the XPath2Result way
XPath2Result xp2r = (XPath2Result)doc.evaluate(...);
while(xp2r.iterateNext()) {
String a = xp2r.asString();
boolean b = xp2r.asBoolean();
}
And the item way:
XPath2Result xp2r = (XPath2Result)doc.evaluate(...);
while(xp2r.iterateNext()) {
String a = xp2r.currentItem().asString();
boolean b = xp2r.currentItem().asBoolean();
}
Sure you have 2 extra method calls per iteration(one of which could be
saved creating a variable) but I don't think it's that big of a cost. And
realistically, how many times are you going to access multiple fields of
the item in either case? I think the further indirection adds clarity to
the code.
If people feel that this is still cumbersome then we could add a
getCurrentItem to the XPath2Result interface. This may lead to some
duplication in methods, but we could always make XPathValue (item) the
base class for XPath2Result.
> In ECMAScript, it makes it more difficult to access the
> results in a single line, etc. This was also previously a concern
> with this approach.
I am unfamiliar with ECMAScript and, if its not too much trouble, would
like to see an example.
Gareth
--
Gareth Reakes, Head of Product Development +44-1865-203192
DecisionSoft Limited http://www.decisionsoft.com
XML Development and Services
Received on Wednesday, 27 August 2003 10:11:38 UTC