Re: FW: Restricting a union? was RE: Schema for schemas bugs?

Hi Simon,

> So Jeni, given that the constraint we quoted below states:
>
>    "B's {variety} is union and D is ***validly derived from*** 
>     a type definition in B's {member type definitions} 
>     given the subset, as defined by this constraint." 
>
> then D could even be an *extension* of one of the member types? For
> example, is the following also valid (seems like a stretch...)?
>
>   <element name="_duration" type="gml:TMDurationType" abstract="true"/>
>   <element name="duration" type="duration"
> substitutionGroup="gml:_duration"/>
>   <element name="tInterval" type="gml:TMIntervalLengthType"
> substitutionGroup="gml:_duration"/>
>   <element name="interval" type="gml:IntervalType"
> substitutionGroup="gml:_duration"/>
>
>   <simpleType name="TMDurationType">
>     <union memberTypes="duration positiveInteger double"/>
>   </simpleType>
>
>   <complexType name="TMIntervalLengthType" final="#all">
>     <simpleContent>
>       <extension base="positiveInteger">
>         <attribute name="unit" type="gml:TimeUnitType" use="required"/>
>         <attribute name="radix" type="positiveInteger" use="optional"/>
>         <attribute name="factor" type="integer" use="optional"/>
>       </extension>
>     </simpleContent>
>   </complexType>
>
>   <complexType name="IntervalType" final="#all">
>     <simpleContent>
>       <extension base="double">
>         <attribute name="unit" type="gml:TimeUnitType" use="required"/>
>       </extension>
>     </simpleContent>
>   </complexType>

Yes, I believe so. The gml:tInterval and gml:interval elements' types
are governed by Schema Component Constraint: Type Derivation OK
(Complex) which states:

  For a complex type definition (call it D, for derived) to be validly
  derived from a type definition (call this B, for base) given a
  subset of {extension, restriction} all of the following must be
  true:
  1 If B and D are not the same type definition, then the
    {derivation method} of D must not be in the subset.
  2 One of the following must be true:
    2.1 B and D must be the same type definition.
    2.2 B must be D's {base type definition}.
    2.3 All of the following must be true:
        2.3.1 D's {base type definition} must not be the ·ur-type
              definition·.
        2.3.2 The appropriate case among the following must be true:
              2.3.2.1 If D's {base type definition} is complex, then
                      it must be validly derived from B given the
                      subset as defined by this constraint.
              2.3.2.2 If D's {base type definition} is simple, then it
                      must be validly derived from B given the subset
                      as defined in Type Derivation OK (Simple)
                      (§3.14.6).

                   http://www.w3.org/TR/xmlschema-1/#cos-ct-derived-ok

In the case of gml:tInterval, for example, we need to check that
gml:TMIntervalLengthType (a complex type with simple content) is a
valid derivation of gml:TMDurationType. This falls under clause
2.3.2.2, so we then need to check that gml:TMIntervalLengthType's base
type definition -- xs:duration -- is validly derived from
gml:TMDurationType. This is governed by Schema Component Constraint:
Type Derivation OK (Simple):

  For a simple type definition (call it D, for derived) to be validly
  derived from a simple type definition (call this B, for base) given
  a subset of {extension, restriction, list, union} (of which only
  restriction is actually relevant) one of the following must be true:
  1 They are the same type definition.
  2 All of the following must be true:
    2.1 restriction is not in the subset, or in the {final} of its own
        {base type definition};
    2.2 One of the following must be true:
        2.2.1 D's ·base type definition· is B.
        2.2.2 D's ·base type definition· is not the ·simple ur-type
                  definition· and is validly derived from B given the
                  subset, as defined by this constraint.
        2.2.3 D's {variety} is list or union and B is the ·simple
              ur-type definition·.
        2.2.4 B's {variety} is union and D is validly derived from a
              type definition in B's {member type definitions} given
              the subset, as defined by this constraint.

                   http://www.w3.org/TR/xmlschema-1/#cos-st-derived-ok
              
Here, clause 2.2.4 is relevant, since gml:TMDurationType is a union
type; xs:duration is validly derived from one of the member type
definitions (specifically xs:duration) because they are the same type
definition.

Of course this only works because you're not blocking any of the
derivations; adding block="extension" to either the element
declaration of gml:_duration or the type definition of
gml:TMDurationType would stop it being valid, I think.

Funky! I hadn't explored this corner of the spec before.

Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/

Received on Wednesday, 1 May 2002 04:39:34 UTC