[
Lists Home |
Date Index |
Thread Index
]
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/
|