Re: XPath DOM and XPath 2.0

Here is my understanding of Michael's suggestion:

interface XPathResult {
 const unsigned short SINGLETON = 0;
 const unsigned short SEQUENCE  = 1;

 readonly attribute unsigned short type;

 readonly attribute XPathSingletonResult singletonResult;
 readonly attribute XPathSequenceResult  sequenceResult;
 
}

interface XPathSingletonResult : XPathResult {
  const unsigned short NUMBER  = 0;
  const unsigned short BOOLEAN = 1;
  const unsigned short STRING  = 2;
  const unsigned short NODE    = 3;

  readonly attribute unsigned short  resultType;

  readonly attribute double          numberValue;
  readonly attribute DOMString       stringValue;
  readonly attribute boolean         booleanValue;
  readonly attribute Node            nodeValue;
}

interface XPathSequenceResult : XPathResult {
  const unsigned short      UNORDERED_VALUE_ITERATOR_TYPE   = 0;
  const unsigned short      ORDERED_VALUE_ITERATOR_TYPE     = 1;
  const unsigned short      UNORDERED_VALUE_SNAPSHOT_TYPE   = 2;
  const unsigned short      ORDERED_VALUE_SNAPSHOT_TYPE     = 3;
  const unsigned short      ANY_UNORDERED_VALUE_TYPE        = 4;
  
  readonly attribute unsigned short  sequenceResultType;

  readonly attribute boolean         invalidIteratorState;
  readonly attribute unsigned long   snapshotLength;

  XPathSingletonResult               iterateNext();
  XPathSingletonResult               snapshotItem(in long index);
}

modulo:
- with or without unsigned as suggested by Curt
- we can make one interface instead of 3 as we did for the current
  XPathResult
- various exceptions

XPathSingletonResult is an XPath 1.0 singleton. We might add SINGLETON2
for XPath 2.0 or extend the interface XPathSingletonResult (XPath 2.0
need support for XML Schema types).

In XPath 1.0, you assume that all sequences will nodes:

XPathSequenceResult mySequence =
   XPathEvaluator.evaluate(".//html:div", myContextNode, myResolver,
                        XPathSequenceResult.ORDERED_VALUE_ITERATOR_TYPE,
                           null);

while ((singleton = mySequence.iterateNext()) != null) {
      Node myNode = singleton.nodeValue;
      // do something
}

instead of (as currently supported in the draft):

XPathResult mySequence =
   XPathEvaluator.evaluate(".//html:div", myContextNode, myResolver, 
                           XPathResult.ORDERED_NODE_ITERATOR_TYPE,
                           null);

while ((myNode = mySequence.iterateNext()) != null) {
      // do something
}

The XPathSingletonResult interface forces the implementation to
encapsulate the Node into an object ... unless the Node implementation
supports the XPathSingletonResult interface (and I'm not sure we want to
implement the DOM that way :). So I certainly see this encapsulation as
a drawback for XPath 1.0 implementers and the XPathSingletonResult will
not be enough for XPath 2.0 anyway and will need to be revised.

Philippe

Received on Tuesday, 2 April 2002 16:58:18 UTC