- From: Henry S. Thompson <ht@cogsci.ed.ac.uk>
- Date: 25 Jul 2000 13:19:06 +0100
- To: "Paul Spencer" <paul.spencer@boynings.co.uk>
- Cc: <xmlschema-dev@w3.org>
"Paul Spencer" <paul.spencer@boynings.co.uk> writes:
> I am currently developing several schemas based on a common set of
> complex data types. It seems reasonable to put the common types in one
> namespace and the "end-user" schemas in several others. My problem is
> that an instance document then has to be aware of which elements are
> from which namespace. Is this a fundamental feature of XML Schema or am
> I doing something wrong?
>
> So for example, a simplified file for the common types might look like:
>
> b.xsd:
> ======
>
> <?xml version="1.0"?>
> <xsd:schema
> targetNamespace="http://example.com/b.xsd"
> xmlns:xsd="http://www.w3.org/1999/XMLSchema"
> xmlns:b="http://example.com/b.xsd"
> elementFormDefault="qualified"
> attributeFormDefault="unqualified">
>
> <xsd:complexType name="AddressStructure">
> <xsd:element name="b:AddressLine" minOccurs="2" maxOccurs="5"
> type="xsd:string"/>
> <xsd:element name="b:PostCode" minOccurs="0" maxOccurs="1"
> type="xsd:string"/>
> </xsd:complexType>
> </xsd:schema>
There is a serious error above -- you must _not_ use QNames as the
names of elements or attributes! Suppose you fix the offending lines
as follows:
<xsd:element name="AddressLine" minOccurs="2"
maxOccurs="5" type="xsd:string"/>
<xsd:element name="PostCode" minOccurs="0"
maxOccurs="1" type="xsd:string"/>
> Any required types would then be imported into what I am calling the
> "end-user" schema (the one that I want people to reference as the
> default in instance documents):
>
> a.xsd:
> ======
>
> <?xml version="1.0"?>
> <xsd:schema
> targetNamespace="http://example.com/a.xsd"
> xmlns:xsd="http://www.w3.org/1999/XMLSchema"
> xmlns:b="http://example.com/b.xsd"
> xmlns:a="http://example.com/a.xsd"
> elementFormDefault="qualified"
> attributeFormDefault="unqualified">
>
> <xsd:import namespace="http://example.com/b.xsd"/>
>
> <xsd:element name="Address" type="b:AddressStructure"/>
> </xsd:schema>
That's all fine.
> I can then create a simple instance document like this:
>
> simple.xml
> ==========
>
> <?xml version="1.0" encoding="UTF-8"?>
> <Address
> xmlns="http://www.boynings.co.uk/GovTalk/Schemas/a.xsd"
> xmlns:b="http://www.boynings.co.uk/GovTalk/Schemas/b.xsd">
>
> <b:AddressLine>1 Somestreet</b:AddressLine>
> <b:AddressLine>Sometown</b:AddressLine>
> </Address>
>
> Is there any way I can do this so that the instance document does not
> need to be aware of which elements are from which namespace? I have just
> worded that in a way that makes me think I am trying to defeat the
> object of namespaces, but my aim is to ensure the uniqueness of names
> through my end-user schemas, which have knowledge of what data types
> they are using. I don't want the instance documents to have to know the
> way the schema is constructed (i.e. whether it is defining the complex
> types itself or importing them).
Since 'AddressLine' and 'PostCode' are local to 'AddressStructure',
if you change elementFormDefault to 'unqualified' in b.xsd you will
get a close instance, if I understand you correctly:
<?xml version="1.0" encoding="UTF-8"?>
<a:Address
xmlns:a="http://www.boynings.co.uk/GovTalk/Schemas/a.xsd">
<AddressLine>1 Somestreet</AddressLine>
<AddressLine>Sometown</AddressLine>
</a:Address>
I find this a bit obscure/misleading -- the other alternative is to
merge the type definitions into the end-user namespace, by taking
advantage of the interaction between <include> and no-namespace
schemas:
b.xsd:
======
<?xml version="1.0"?>
<xsd:schema
xmlns:xsd="http://www.w3.org/1999/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xsd:complexType name="AddressStructure">
<xsd:element name="AddressLine" minOccurs="2" maxOccurs="5"
type="xsd:string"/>
<xsd:element name="PostCode" minOccurs="0" maxOccurs="1"
type="xsd:string"/>
</xsd:complexType>
</xsd:schema>
a.xsd:
======
<?xml version="1.0"?>
<xsd:schema
targetNamespace="http://example.com/a.xsd"
xmlns:xsd="http://www.w3.org/1999/XMLSchema"
xmlns:a="http://example.com/a.xsd"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xsd:include
schemaLocation="http://www.boynings.co.uk/GovTalk/Schemas/b.xsd"/>
<xsd:element name="Address" type="AddressStructure"/>
</xsd:schema>
instance:
<?xml version="1.0" encoding="UTF-8"?>
<Address
xmlns="http://www.boynings.co.uk/GovTalk/Schemas/a.xsd">
<AddressLine>1 Somestreet</AddressLine>
<AddressLine>Sometown</AddressLine>
</Address>
ht
--
Henry S. Thompson, HCRC Language Technology Group, University of Edinburgh
W3C Fellow 1999--2001, part-time member of W3C Team
2 Buccleuch Place, Edinburgh EH8 9LW, SCOTLAND -- (44) 131 650-4440
Fax: (44) 131 650-4587, e-mail: ht@cogsci.ed.ac.uk
URL: http://www.ltg.ed.ac.uk/~ht/
Received on Tuesday, 25 July 2000 08:19:13 UTC