- From: Jeni Tennison <jeni@jenitennison.com>
- Date: Thu, 14 Feb 2002 07:51:40 +0000
- To: Sameek Ghosh <sameekghosh@vispark.com>
- CC: xmlschema-dev@w3.org
Hi Sameek,
> Want something like this
>
> <xs:element name="Menu">
> <xs:complexType>
> <xs:sequence>
>
> <element name="File" type="xs:string"/>
> <element name="Edit" type="xs:string"/>
> <element name="Menu" type="xs:Menu"/> //***See this***//
>
> </xs:sequence>
> </xs:complexType>
> </xs:element>
You want the third element (Menu) in the content model to refer to the
global Menu element. To do that, you need the other form of xs:element
- with a ref attribute that refers to the global element, as follows:
<xs:element name="Menu">
<xs:complexType>
<xs:sequence>
<xs:element name="File" type="xs:string"/>
<xs:element name="Edit" type="xs:string"/>
<xs:element ref="Menu" />
</xs:sequence>
</xs:complexType>
</xs:element>
When you do this kind of recursively nested schema, though, you should
always make sure that the recursive reference is *optional*.
Otherwise, the content model can never stop, and you can never create
an instance that satisfies it. So actually what you need is:
<xs:element name="Menu">
<xs:complexType>
<xs:sequence>
<xs:element name="File" type="xs:string"/>
<xs:element name="Edit" type="xs:string"/>
<xs:element ref="Menu" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
If you don't want Menu to be a global element, then you can do the
same kind of thing by declaring the *complexType* at the top level,
and referring to that when you fix the type of the local Menu element,
as follows:
<xs:element name="Menu" type="MenuType" />
<xs:complexType name="MenuType">
<xs:sequence>
<xs:element name="File" type="xs:string"/>
<xs:element name="Edit" type="xs:string"/>
<xs:element name="Menu" type="MenuType" minOccurs="0" />
</xs:sequence>
</xs:complexType>
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
Received on Thursday, 14 February 2002 02:51:48 UTC