- From: Eric MALENFANT <Eric.Malenfant@sagem-interstar.com>
- Date: Tue, 4 Dec 2007 15:41:17 -0500
- To: <xmlschema-dev@w3.org>
Michael Kay, le 30 novembre 2007 19:22: >> I am thus wondering if there is a better way to define "related" >> types like this. For example, is there a way to express the >> definition of EntryPredicate by saying something like "this is the >> same thing than an Entry, replacing dateTime by dateTimeRange, >> unsingedInt by unsignedIntRange"? > > Not within the XML Schema language. > > Sometimes when your application contains higher-level structures or > patterns like this, it can be appropriate to describe the high-level > structure in your own notation and then generate the XML Schema > definitions from this > (typically using XSLT to do the transformation). Thanks for replying. I had the following (crazy?) idea, and would be grateful for any comments about it: First enumerate the names of the elements, grouping them by their associated types: <xs:simpleType name="StringElementName"> <xs:restriction base="xs:string"> <xs:enumeration value="Subject"/> <!-- Name of other elements of type "string" go here... --> </xs:restriction> </xs::simpleType> <xs:simpleType name="DateTimeElementName"> <xs:restriction base="xs:string"> <xs:enumeration value="Received"/> <!-- Name of other elements of type "dateTime" go here... --> </xs:restriction> </xs::simpleType> <xs:simpleType name="BooleanElementName"> <xs:restriction base="xs:string"> <xs:enumeration value="IsViewed"/> <!-- Name of other elements of type "boolean" go here... --> </xs::simpleType> <xs:simpleType name="UnsignedIntElementName"> <xs:restriction base="xs:string"> <xs:enumeration value="Pages"/> <!-- Name of other elements of type "unsignedInt" go here... --> </xs::simpleType> Then define Entry as simply being a bunch of EntryElements: <xs:complexType name="Entry"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="Element" type="EntryElement" /> </xs:sequence> </xs:complexType> An EntryElement being a named string, dateTime, boolean or unsignedInt: <xs:complexType name="EntryElement"> <xs:choice> <xs:element name="String"/ type="StringEntryElement"/> <xs:element name="DateTime"type="DateTimeEntryElement"/> <xs:element name="Boolean" type="BooleanEntryElement"/> <xs:element name="UnsignedInt" type="UnsignedIntEntryElement"/> </xs:choice> </xs:complexType> <xs:complexType name="StringEntryElement"> <xs:sequence> <xs:element name="Name" type="StringElementName"/> <xs:element name="Value" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:complexType name="DateTimeEntryElement"> <xs:sequence> <xs:element name="Name" type="DateTimeElementName"/> <xs:element name="Value" type="xs:dateTime"/> </xs:sequence> </xs:complexType> <xs:complexType name="BooleanEntryElement"> <xs:sequence> <xs:element name="Name" type="BooleanElementName"/> <xs:element name="Value" type="xs:boolean"/> </xs:sequence> </xs:complexType> <xs:complexType name="UnsignedIntEntryElement"> <xs:sequence> <xs:element name="Name" type="UnsignedIntElementName"/> <xs:element name="Value" type="xs:unsignedInt"/> </xs:sequence> </xs:complexType> Now, I can reuse the "xxxElementName" defined above in the definition of EntryPredicate: <xs:complexType name="EntryPredicate"> <xs:sequence> <xs:element minOccurs="0" maxOccurs="unbounded" name="Predicate" type="PredicateElement" /> </xs:sequence> </xs:complexType> <xs:complexType name="PredicateElement"> <xs:choice> <xs:element name="String"/ type="StringPredicateElement"/> <xs:element name="DateTime"type="DateTimePredicateElement"/> <xs:element name="Boolean" type="BooleanPredicateElement"/> <xs:element name="UnsignedInt" type="UnsignedIntPredicateElement"/> </xs:choice> </xs:complexType> <xs:complexType name="StringPredicateElement"> <xs:sequence> <xs:element name="Name" type="StringElementName"/> <xs:element name="Value" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:complexType name="DateTimePredicateElement"> <xs:sequence> <xs:element name="Name" type="DateTimeElementName"/> <xs:element name="Begin" type="xs:dateTime"/> <xs:element name="End" type="xs:dateTime"/> </xs:sequence> </xs:complexType> <xs:complexType name="BooleanPredicateElement"> <xs:sequence> <xs:element name="Name" type="BooleanElementName"/> <xs:element name="Value" type="xs:boolean"/> </xs:sequence> </xs:complexType> <xs:complexType name="UnsignedIntPredicateElement"> <xs:sequence> <xs:element name="Name" type="UnsignedIntElementName"/> <xs:element name="Begin" type="xs:unsignedInt"/> <xs:element name="End" type="xs:unsignedInt"/> </xs:sequence> </xs:complexType> If I want to add another parameter to my web method to allow the caller to specify an ordering for the returned elements, I could define it like this: <xs:complexType name="SortingElement"> <xs:sequence> <xs:choice> <xs:element name="ElementName" type="StringElementName"/> <xs:element name="ElementName" type="DateTimeElementName"/> <xs:element name="ElementName" type="BooleanElementName"/> <xs:element name="ElementName" type="UnsignedIntElementName"/> </xs:choice> <xs:element name="Ascending" type="xs:boolean"/> </xs:sequence> </xs:complexType> If you read up to here: 1) Congratulations 2) Do you have any comments? Éric Malenfant ---------------------------------------------
Received on Tuesday, 4 December 2007 20:41:03 UTC