Re: TypeInfo#isDerivedFrom

On Aug 9, 2004, at 4:02 AM, Michael Kay wrote:

>
> If type A is derived indirectly from type B by a sequence of steps that
> includes both restriction and extension, what result should
> A.isDerivedFrom(B, x) return where:
>
> (a) x is 0
> (b) x is DERIVATION_EXTENSION
> (c) x is DERIVATION_RESTRICTION
> (d) x is DERIVATION_EXTENSION | DERIVATION_RESTRICTION
>
> The answer to (a) seems to be clearly documented as TRUE. I can't find  
> an
> explanation of what the other three cases should return.
>
> Obviously the result of (b) and (c) should be the same, and the spec  
> does
> say that the result of (d) should be the result of b OR c, so it boils  
> down
> to the question, what does (b) return?
>


a = true, b = true, c = false, d = true

Test cases testinfoisderivedfrom32, 33 and 34 test that type of  
scenario.  Test 32 is equivalent to scenarios a and d, 33 == scenario b  
and 34 == scenario c.

The definition of DERIVATION_RESTRICTION  
(http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/ 
core.html#TypeInfo-DERIVATION_RESTRICTION) ends with the phrase: "and  
all the derivation methods involved are  restriction."  In this  
scenario, one of the derivation methods is not restriction, so that  
condition is not satisfied and c is false.

The definition of DERIVATION_EXTENSION  
(http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/ 
core.html#TypeInfo-DERIVATION_EXTENSION) ends with the phrase: "at  
least one  of the derivation methods involved is an  extension".  In  
this scenario, at least one step is an extension, so the condition is  
satisfied and b is true.

In the description of Definition Groups DerivationMethods:  "When   
using the isDerivedFrom method, combining all of  them in the  
derivationMethod parameter is  equivalent to invoking the method for  
each of them separately  and combining the results with the OR boolean  
function."  So

A.isDerivedFrom(B, METHOD_RESTRICTION | METHOD_EXTENSION) ==
     A.isDerivedFrom(B, METHOD_RESTRICTION) || A.isDerivedFrom(B,  
METHOD_EXTENSION) ==
     false || true == true

The definition of METHOD_RESTRICTION was designed so that if  
A.isDerivedFrom(B, METHOD_RESTRICTION) were true then it would follow  
that all legal values for type A were also legal values for type B.   
This would allow you to, for example, ask if a type was derived by  
restriction from xsd:double.  If it returned true, you could check  
proposed values to see if they were of type double and if not, you  
could safely reject it as not being a legal value for the type.

Received on Monday, 9 August 2004 20:55:16 UTC