One of the existing non-XML parsers
from IBM is capable of modelling an integer or decimal with non-contiguous
ranges, eg, 0-100, 200-300, 400-500. It is also possible to model
this using XML Schema, using a user-defined simple type which is a union
of simple type restrictions.
However it is not possible to model
this in DFDL because unions are not supported. A choice could be used,
but that would give different named elements in the resultant infoset depending
on the value, which is not ideal.
I believe this is use case that we should
consider for DFDL 1.0. We could decide to allow unions, but with
a constraint that the members of the union had to be restrictions of the
same built-in type, and that clashing DFDL properties on the members was
an error. I believe the existing scoping rules for visiting types would
still apply ok. No annotation appears on the xs:union only on the xs:simpleType
as currently. The net effect is that our parsing rules are the same as
currently, but we gain validation capability.
I am not in favour of more widespread
support for unions. I don't have a compelling use case for union of different
logical types, eg, xs:dateTime and xs:string.
Your thoughts are welcome.
!-- integer range 0 - 100
<xsd:simpleType name="intRange1">
<xsd:restriction base="xsd:int">
<xsd:maxInclusive
value="100"/>
<xsd:minInclusive
value="0"/>
</xsd:restriction>
</xsd:simpleType>
!-- integer range 200 - 300
<xsd:simpleType name="intRange2">
<xsd:restriction base="xsd:int">
<xsd:maxInclusive
value="300"/>
<xsd:minInclusive
value="200"/>
</xsd:restriction>
</xsd:simpleType>
!-- integer range 400-500
<xsd:simpleType name="intRange3">
<xsd:restriction base="xsd:int">
<xsd:maxInclusive
value="500"/>
<xsd:minInclusive
value="400"/>
</xsd:restriction>
</xsd:simpleType>
!-- Union of above types
<xsd:simpleType name="intRange">
<xsd:union memberTypes="intRange1
intRange2 intRange3"/>
</xsd:simpleType>
!-- Union of anonymous types
being restrictions of above types
<xsd:simpleType name="intRangeLocal">
<xsd:union>
<xsd:simpleType>
<xsd:restriction
base="intRange1"/>
</xsd:simpleType>
<xsd:simpleType>
<xsd:restriction
base="intRange2"/>
</xsd:simpleType>
<xsd:simpleType>
<xsd:restriction
base="intRange3"/>
</xsd:simpleType>
</xsd:union>
</xsd:simpleType>
!-- Union of anonymous types
being local restrictions
<xsd:simpleType name="intRangeLocalRestrictions">
<xsd:union>
<xsd:simpleType>
<xsd:restriction
base="xsd:int">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="100"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType>
<xsd:restriction
base="xsd:int">
<xsd:minInclusive value="200"/>
<xsd:maxInclusive value="300"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType>
<xsd:restriction
base="xsd:int">
<xsd:minInclusive value="400"/>
<xsd:maxInclusive value="500"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:union>
</xsd:simpleType>
Regards
Steve Hanson
Programming Model Architect
WebSphere Message Brokers
Hursley, UK
Internet: smh@uk.ibm.com
Phone (+44)/(0) 1962-815848
Unless stated otherwise above:
IBM United Kingdom Limited - Registered in England and Wales with number
741598.
Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6
3AU