- From: Jeni Tennison <jeni@jenitennison.com>
- Date: Sun, 11 Aug 2002 19:05:03 +0100
- To: xmlschema-dev@w3.org, Danny Vint <dvint@mindspring.com>
- CC: xml-dev@lists.xml.org
Hi Danny, Your question is appropriate for xmlschema-dev@w3.org. You probably shouldn't cross-post to xml-dev@lists.xml.org. I'm only cross-posting so that they know it's been answered; please post follow-ups to xmlschema-dev@w3.org. > The problem seems to be around the use of simpleContent or > complexContent and these types: > > Here are my base definitions of the types that I use: > > <xsd:complexType name="C-255"> > <xsd:simpleContent> > <xsd:extension base="C-255_NoID"> > <xsd:attribute ref="id"/> > </xsd:extension> > </xsd:simpleContent> > </xsd:complexType> > <xsd:simpleType name="C-255_NoID"> > <xsd:restriction base="xsd:string"> > <xsd:maxLength value="255"/> > <xsd:minLength value="1"/> > </xsd:restriction> > </xsd:simpleType> > > I then have the following: > > <xsd:element name="HelpText"> > <xsd:complexType> > <xsd:complexContent> > <xsd:extension base="C-255"> > <xsd:attribute ref="xml:lang"/> > </xsd:extension> > </xsd:complexContent> > </xsd:complexType> > </xsd:element> > > MS-XML indicates that instead of complexContent, the definition of > HelpText should use simpleContent. Is this correct? Is this a real > error or a preferred way to define this element? Yes, it's a real error. If you did: <xsd:element name="HelpText"> <xsd:complexType> <xsd:simpleContent> <xsd:extension base="C-255"> <xsd:attribute ref="xml:lang"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType> </xsd:element> then it would be just fine (and would be correct -- the HelpText element has two attributes (which means it must be a complex type) but has simple content (a string). > If MS-XML is correct, could we have made the Schema process any more > difficult? Why can't I use complexContent, with a type defined as a > complexType and simpleContent with a type defined as simpleType? I agree that this can be confusing. XML Schema divides types into two kinds: complex types, which allow element content and/or attributes; and simple types, which don't. XML Schema then splits complex types (which allow attributes) into two classes: those with purely textual content (simple content) and those with element content (complex content). Diagrammatically: Type /\ / \ / \ Simple Complex allows attributes or elements? Type Type /\ / \ / \ Simple Complex allows elements in content? Content Content The restriction that you're running into is that you can't derive a complex type with complex content from one with simple content. If you need to extend a complex type with textual content to one that also allows elements, then you have to start off with a complex type that has complex content (allows elements in the first place) and is mixed (to allow the text that you want). Similarly, you can't derive a complex type from a simple type except to extend it by adding attributes. I guess that this prevents you from doing: <xs:complexType name="price"> <xs:complexContent> <xs:extension base="xs:decimal"> <xs:element name="currency" type="xs:token" /> </xs:extension> </xs:complexContent> </xs:complexType> to validate: <price>12.99<currency>GBP</currency></price> but that's pretty bad XML design anyway (and I'll note that RELAX NG doesn't support it either). Cheers, Jeni --- Jeni Tennison http://www.jenitennison.com/
Received on Sunday, 11 August 2002 14:05:05 UTC