- From: Eddie Robertsson <eddie@allette.com.au>
- Date: Tue, 15 Jan 2002 10:31:41 +1100
- To: xiaofeng.wang@ps.ge.com
- CC: xmlschema-dev@w3.org
> Hello everybody: > > I found a hard time to map inheritance defined in UML to XML Schema. > Usually, the complex type extension is used for inheritance. Then, two > issues raised: I think there are many who's been trying to fit XML to fit in with UML but from what I have read on the mailing lists this is not an easy mapping to make. I was going to suggest Dave Carlson's work but I see that you already have a link to his work. Maybe someone else have more links for you? > (1) Use <sequence> or <all> ? > <sequence> specify the order of elements defined in it. But in UML, there is > no such specification for order. Attributes and associations defined in a > class may appear in any order. It seems <all> is good choice (??) I guess the <all> group would be the best choice but as you have found out it does have it's limitations. Especially when it comes to using the <all> group in an extension. See below. > (2) How to use <all> > <all> does provide the flexibility for order. But it has other restrictions. > It seems hard for me to handle multi-level inheritance defined in UML. > Reference [1] shows an example for mapping Inheritance defined in UML to XML > Schema. It looks like: > > <xsd:element name = "Address" type = "Address" abstract = "true"/> > <xsd:complexType name = "Address" abstract = "true"> > <xsd:all> > <xsd:element name = "name" type = "xsd:string"/> > <xsd:element name = "street" type = "xsd:string"/> > <xsd:element name = "city" type = "xsd:string"/> > </xsd:all> > </xsd:complexType> > <xsd:element name = "USAddress" type = "USAddress" substitutionGroup > = "Address"/> > <xsd:complexType name = "USAddress"> > <xsd:complexContent> > <xsd:extension base = "Address"> > <xsd:all> > <xsd:element name = "state" type = > "xsd:string"/> > <xsd:element name = "zip" type = > "xsd:positiveInteger"/> > </xsd:all> > </xsd:extension> > </xsd:complexContent> > </xsd:complexType> > > This schema can't pass the validation check, and the error is "groups are > not allowed in ALL element". The problem with the <all> group is that it must be the only child of the complexType declaration and it can't have nested <all>, <choice> or <sequence> groups. This means that you can never use an <all> group in a base type that should be derived by extension. The reason for this is that when you create type derived by extension it will be expanded to be a <sequence> of the base particle and the particle defined in the extension. For example: <xs:complexType name="base"> <xs:all> <xs:element name="a1"/> <xs:element name="a2"/> </xs:all> </xs:complexType> <xs:complexType name="derived"> <xs:all> <xs:element name="a1"/> </xs:all> </xs:complexType> The derived type will be expanded to the following: <xs:complexType name="derived"> <xs:sequence> <xs:all> <xs:element name="a1"/> <xs:element name="a2"/> </xs:all> <xs:all> <xs:element name="a1"/> </xs:all> <xs:sequence> </xs:complexType> Which is now allowed by the recommendation since the <all> group is no longer the only child of the complexType element. > But if I change the <all> defined in the base complex type to <sequence>, it > passed the validation check without any error. Could anybody please explain > this? What validator are you using? It seems it has a bug because this shouldn't be allowed either for the same reasons as given above. A basic rule is that the <all> group can never be used in a derivation by extension. Cheers, /Eddie
Received on Monday, 14 January 2002 18:23:04 UTC