Obtaining an XPathEvaluator (also Node.getFeature())

Phillipe Le Hegaret commited XPath tests earlier this month that 
contained the following boilerplate.

   <!-- The following code is to create the evaluator using
        either the getFeature method defined in DOM3 or
        the cast mechanism. Implementation are not required
        to support both but at least one of them -->
   <assign var='xpEvaluator' value='null'/>
   <isSupported obj='doc' feature='&quot;core&quot;'
     version='&quot;3.0&quot;' var='state'/>
   <if>
     <isTrue value='state' />
     <getFeature interface='Node' var='xpEvaluator' obj='doc'
       feature='&quot;XPath&quot;'
       version='&quot;3.0&quot;'/>
   </if>
   <if>
     <isNull obj='xpEvaluator' />
     <assign var='xpEvaluator' value='doc'/>
   </if>


http://www.w3.org/TR/2003/CR-DOM-Level-3-XPath-20030331/xpath.html#XPathEvaluator 
  says:

The evaluation of XPath expressions is provided by XPathEvaluator. In a 
DOM implementation which supports the XPath 3.0 feature, as described 
above, the XPathEvaluator interface will be implemented on the same 
object which implements the Document interface permitting it to be 
obtained by the usual binding-specific method such as casting or by 
using the DOM Level 3 getInterface method. In this case the 
implementation obtained from the Document supports the XPath DOM module 
and is compatible with the XPath 1.0 specification.

http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/core.html#Node3-getFeature 


This method returns a specialized object which implements the 
specialized APIs of the specified feature and version. The specialized 
object may also be obtained by using binding-specific casting methods 
but is not necessarily expected to, as discussed in Mixed DOM 
implementations. This method also allow the implementation to provide 
specialized objects which do not support the Node interface
....

Return Value
Node
  Returns an object which implements the specialized APIs of the 
specified feature and version, if any, or null if there is no object 
which implements interfaces associated with that feature. If the 
DOMObject returned by this method implements the Node interface, it must 
delegate to the primary core Node and not return results inconsistent 
with the primary core Node such as attributes, childNodes, etc.

------------------------------

The discussion on obtaining an XPathEvaluator is inconsistent with the 
DOM 3 Core spec.  The getInterface() method does not exist in the 
current Core draft, it has changed to getFeature().  The XPathEvaluator 
discussion of binding is stricter than the equivalent discussion in 
getFeature().  The XPath discussion may be interpreted that casting is 
always available where the getFeature explicitly disclaims that you 
cannot depend on casting to obtain a specialized interface.

The discussion of Node.getFeature() says:

 > This method also allow the implementation to provide specialized
 > objects which do not support the Node interface.  If the DOMObject
 > returned by this method implements the Node interface, it must
 > delegate to the primary core Node and not return results inconsistent
 > with the primary core Node such as attributes, childNodes, etc.

The method is defined as returning a Node and therefore anything 
returned from this method must support the Node interface.  The text 
would be appropriate if the return type had been DOMObject.

I'd suggest:

Change the return type of Node.getFeature() to DOMObject.

Add a conformance requirement to DOM XPath that if 
document.implementation.hasFeature("XPath", version) and 
document.implementation.hasFeature("Core", "3.0") are true then 
document.getFeature("XPath", version) must return an instance of 
XPathEvaluator.

Clarify under what conditions being able to cast Document to 
XPathEvaluator is a conformance requirement.  If it always, or is it 
only required when implementation.hasFeature("Core", "3.0") is false.

Rework the description on obtaining an XPathEvaluator.  Depending on the 
   resolution of the other issues, there may be no need to 
XPathEvaluator to be implemented on the same object as Document.

Received on Friday, 18 April 2003 13:24:41 UTC