- From: Eddie Robertsson <eddie@allette.com.au>
- Date: Thu, 10 Jan 2002 10:49:23 +1100
- To: boriero <aboriero@hoc.elet.polimi.it>
- CC: XSD <xmlschema-dev@w3.org>
Hi,
boriero wrote:
> Can I create a new complexType with a simpleContent by
> restricting or extending a basetype which is itself derived by
> restriction or extension ?
>
In short, Yes. But it's important to remember that a complexType with
simpleContent can only be derived from either complexTypes _that
themselves_ have simpleContent (by restriction or extension) or
simpleTypes (by extension). See [1].
> <xs:complexType name="1" mixed="true">
> <xs:simpleContent>
> <xs:extension base="xs:string">
> <xs:attribute name="x" type="xs:integer"/>
> </xs:extension>
> </xs:simpleContent>
> </xs:complexType>
This is not correct. In XSD you can't specify a type for the text
content in mixed content model. By specifying the simpleContent child
element you restrict the type to have text content only which doesn't
make sence for a mixed content model. So, in order to create a mixed
type it must have complexContent.
> <xs:complexType name="2">
> <xs:simpleContent>
> <xs:extension base="1">
> <xs:attribute name="b" type="xs:string"/>
> </xs:extension>
> </xs:simpleContent>
> </xs:complexType>
Appart from the mixed="true" in type 1 this should work fine.
> <xs:complexType name="3>
> <xs:simpleContent>
> <xs:restriction base="1">
> <xs:minLength value="2"/>
> </xs:restriction>
> </xs:simpleContent>
> </xs:complexType>
As I read the spec this should also be valid although none of the
validators I tested with could validate this type correctly.
> 2. when i create a new complexType with a complexContent , can
> i restrict a base type removing one or more child elements?
>
> Yes, as long as the elements you want to remove are optional in the
> base type. The basic rule is (as written in the Primer):
> "...an application prepared for the values of the base type would not
> be surprised by the values of the restricted type."
> See comments below.
> <xs:complexType name="Com">
> <xs:sequence>
> <xs:element name="B" type="xs:string"/>
> <xs:element name="C" type="xs:integer"/>
> <xs:element name="D" type="xs:string" maxOccurs="unbounded"/>
> </xs:sequence>
> </xs:complexType>
> <xs:complexType name="Comrestr">
> <xs:complexContent>
> <xs:restriction base="Com">
> <xs:sequence>
> <xs:element name="B" type="xs:string"/>
> <xs:element name="C" type="xs:integer"/>
> </xs:sequence>
> </xs:restriction>
> </xs:complexContent>
> </xs:complexType>
This restriction is invalid because the element you try to remove (D) is
in fact required in the base type. To make this work you have to make
the D element optional in the base type by changing the declaration:
<xs:element name="D" type="xs:string" minOccurs="0"
maxOccurs="unbounded"/>
> 3. May someone explain to me,even by an example, the use and
> meaning of <simpleType> as a child of a
> <simpleContent>...<restriction> ?
> <xs:complexType name="...">
> <xs:simpleContent>
> <xs:restriction base="..." >
> <xs:simpleType name="...">
This is not valid as you have written it. The reason being that you
can't declare a named simpleType that isn't a direct child of the
xs:schema element. Written like this:
<xs:complexType name="...">
<xs:simpleContent>
<xs:restriction base="..." >
<xs:simpleType>
<xs:restriction base="xs:integer"/>
It could be used to restrict the text content of a previously defined
complexType. However, there is a contradiction in the spec regarding
this issue, see Henry's mail earlier [2].
[1] http://www.w3.org/TR/xmlschema-1/#declare-type (in the table with
heading: Complex Type Definition with simple content Schema Component)
[2] http://lists.w3.org/Archives/Public/xmlschema-dev/2002Jan/0063.html
Received on Wednesday, 9 January 2002 18:40:33 UTC