- From: Costello, Roger L. <costello@mitre.org>
- Date: Fri, 25 Feb 2011 05:41:09 -0500
- To: "xmlschema-dev@w3.org" <xmlschema-dev@w3.org>
Hi Folks, Decoupling the definition of a simpleType from an element or attribute declaration is very useful. For example, here I define a family name simpleType: <xs:simpleType name="Family-name"> <xs:restriction base="xs:string"> <xs:minLength value="1" /> <xs:maxLength value="100" /> <xs:pattern value="[a-zA-Z' \.-]+" /> </xs:restriction> </xs:simpleType> Now that it is defined, I can declare any number of elements or attributes to be of that type; for example: <xs:element name="Family-name" type="Family-name" /> <xs:element name="Surname" type="Family-name" /> <xs:element name="Last-name" type="Family-name" /> That's nice! The definition of the user-defined simpleType and the declaration of the elements are completely decoupled. The Family-name simpleType is a reusable data type. Suppose I define 2 more simpleTypes. A simpleType for Middle initial: <xs:simpleType name="Middle-initial"> <xs:restriction base="xs:string"> <xs:length value="1" /> <xs:pattern value="[A-Z]+" /> </xs:restriction> </xs:simpleType> And a simpleType for Given name: <xs:simpleType name="Given-name"> <xs:restriction base="xs:string"> <xs:minLength value="1" /> <xs:maxLength value="100" /> <xs:pattern value="[a-zA-Z' \.-]+" /> </xs:restriction> </xs:simpleType> Thus there are 3 simpleTypes. Collectively, they make up a user-defined "Name" data type. Of course, this Name data type is not a simpleType. It is made up of three simpleTypes. XML Schema does not have a way to express this so I propose a new capability, <xs:crossProduct>. Here is how to define the Name data type: <xs:crossProduct name="Name"> <xs:componentType ref="Given-name" /> <xs:componentType ref="Middle-initial" /> <xs:componentType ref="Family-name" /> </xs:crossProduct> That defines a data type that is a cross product of 3 simpleTypes. Now that it is defined, I can declare any number of elements to be of that data type; for example: <xs:element name="Name" type="Name"> <xs:element name="First" type="Name.Given-name" /> <xs:element name="MI" type="Name.Middle-initial" /> <xs:element name="Last" type="Name.Family-name" /> </xs:element> Here's a different assignment of element names to the data type and its components: <xs:element name="Customer" type="Name"> <xs:element name="Given" type="Name.Given-name" /> <xs:element name="MI" type="Name.Middle-initial" /> <xs:element name="Surname" type="Name.Family-name" /> </xs:element> Here's how the latter would appear in an XML instance document: <Customer> <Given>Roger</Given> <MI>L</MI> <Surname>Costello</Surname> </Customer> The important thing to notice is that the data type definition is completely decoupled from the assignment of element names to the component fields of the data type. To recap: just like xs:simpleType enables the creation of reusable (simple) data types, xs:crossProduct enables the creation of reusable (cross product) data types. Comments? /Roger
Received on Friday, 25 February 2011 10:41:45 UTC