- From: George Cristian Bina <george@sync.ro>
- Date: Tue, 22 Mar 2005 09:41:11 +0200
- To: Eliot Kimber <ekimber@innodata-isogen.com>
- Cc: xml-schema-dev <xmlschema-dev@w3.org>
Hi Eliot,
I think you can use abstract elements and substitution groups to achieve
something similar with your example. See the following sample schema:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="InformationModule" abstract="true"
type="InformationModuleType"/>
<xs:complexType name="InformationModuleType">
<xs:sequence>
<xs:element ref="ObjectName"/>
<xs:element ref="ShortDesc"/>
<xs:element maxOccurs="unbounded" ref="InformationModuleItem"/>
</xs:sequence>
</xs:complexType>
<xs:element name="ObjectName" abstract="true"/>
<xs:element name="ShortDesc"/>
<xs:element name="InformationModuleItem" abstract="true"/>
<xs:element name="ElementType" substitutionGroup="InformationModule"/>
<xs:element name="ElementTypeName" substitutionGroup="ObjectName"/>
<xs:element name="Purpose" substitutionGroup="InformationModuleItem"/>
<xs:element name="ContentModel"
substitutionGroup="InformationModuleItem"/>
</xs:schema>
The following instance is valid against the schema:
<?xml version="1.0" encoding="UTF-8"?>
<ElementType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="sample.xsd">
<ElementTypeName></ElementTypeName>
<ShortDesc></ShortDesc>
<Purpose></Purpose>
<ContentModel></ContentModel>
</ElementType>
Also the same instance is valid against a little more restricted schema
as below:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="InformationModule" abstract="true"
type="InformationModuleType"/>
<xs:complexType name="InformationModuleType">
<xs:sequence>
<xs:element ref="ObjectName"/>
<xs:element ref="ShortDesc"/>
<xs:element maxOccurs="unbounded" ref="InformationModuleItem"/>
</xs:sequence>
</xs:complexType>
<xs:element name="ObjectName" abstract="true"/>
<xs:element name="ShortDesc"/>
<xs:element name="InformationModuleItem" abstract="true"/>
<xs:element name="ElementType"
substitutionGroup="InformationModule" type="ElementTypeType"/>
<xs:complexType name="ElementTypeType">
<xs:complexContent>
<xs:restriction base="InformationModuleType">
<xs:sequence>
<xs:element ref="ElementTypeName"/>
<xs:element ref="ShortDesc"/>
<xs:choice maxOccurs="unbounded">
<xs:element ref="Purpose"/>
<xs:element ref="ContentModel"/>
</xs:choice>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:element name="ElementTypeName" substitutionGroup="ObjectName"/>
<xs:element name="Purpose" substitutionGroup="InformationModuleItem"/>
<xs:element name="ContentModel"
substitutionGroup="InformationModuleItem"/>
</xs:schema>
Hope that helps,
George
---------------------------------------------------------------------
George Cristian Bina
<oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger
http://www.oxygenxml.com
Eliot Kimber wrote:
>
> What I'm trying to do is define an abstract type with a specific content
> model that should act as the model for specialized types such that
> specialized types must declare sub element types of the same type as in
> my model.
>
> For example, my abstract complex type is as follows, with an indication
> of the desired specialization rules:
>
> InformationModule [specialization required] goes to:
> <ObjectName> [specialization required]
> <ShortDesc> [specialization optional]
> <InformationModuleItem>+ [specialization required]
>
>
> With the intent that InformationModule must be used as the type for
> specialized elements and those elements must specialize <ObjectName> and
> <InformationModuleItem>, e.g.,
>
> <ElementType> [xsi:type="InformationModule"]
> <ElementTypeName> [xsi:type="ObjectName"]
> <ShortDesc>
> <Purpose> [xsi:type="InformationModuleItem"]
> <ContentModel> [xsi:type="InformationModuleItem"]
> </Element>
>
> What I want to be able to do, but I realize I can't, is define an
> abstract type that defines its content model in terms of types, not in
> terms of element types. But lacking that, I'm not sure how to do what I
> want.
>
> I think that substitution groups is the mechanism to use but it's not
> immediagely clear now to do it and I fear that I'm not thinking about
> this task in the right way, that I'm trying to be too object oriented
> and that that is throwing me off.
>
> Can anyone point me in the right direction or help me understand the
> Schema way to think about this sort of problem?
>
> What I'm trying to do is essentially what the old HyTime SGML
> architecture mechanism let you do and what the DITA specialization
> mechanism lets you do. There doesn't seem to be a direct correlation to
> either of those mechanisms in XSD but I want to make sure I haven't
> missed something.
>
> Thanks,
>
> Eliot
Received on Tuesday, 22 March 2005 07:32:38 UTC