- From: Roger L. Costello <costello@mitre.org>
- Date: Thu, 22 Feb 2001 18:44:04 -0500
- To: xmlschema-dev@w3.org, costello@mitre.org
Hi Folks,
I have been telling everyone that a constraint on creating no-namespace
components (Chameleon components) is that they must not be coupled
(i.e., one component cannot reference another) because the coupling will
break when the no-namespace schema is <include>d into a schema with a
targetNamespace. Now, I am thinking that that is not true.
Consider this no-namespace schema:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
elementFormDefault="qualified">
<xsd:complexType name="CardCatalogueEntry">
<xsd:sequence>
<xsd:element name="Title" type="xsd:string"/>
<xsd:element name="Author" type="xsd:string"/>
<xsd:element name="Date" type="xsd:string"/>
<xsd:element name="ISBN" type="xsd:string"/>
<xsd:element name="Publisher" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:element name="Book" type="CardCatalogueEntry"/>
</xsd:schema>
[As an aside: what meaning does elementFormDefault have with
no-namespace schemas?]
This schema has two components - a complexType CardCatalogueEntry
component and an element Book component. The Book component references
the CardCatalogueEntry component.
Consider what happens when these components are included in a schema
with a namespace. Let's consider two scenarios:
[1] The including schema has XMLSchema as the default namespace:
<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2000/10/XMLSchema"
targetNamespace="http://www.library.org"
elementFormDefault="qualified"
xmlns:lib="http://www.library.org">
<include schemaLocation="BookCatalogue.xsd"/>
<element name="Library">
<complexType>
<sequence>
<element name="BookCatalogue">
<complexType>
<sequence>
<element ref="lib:Book"/>
</sequence>
</complexType>
</sequence>
</complexType>
</element>
</schema>
Clearly, the reference of Book to CardCatalogueEntry in the no-namespace
schema:
<xsd:element name="Book" type="CardCatalogueEntry"/>
will fail since CardCatalogueEntry is no longer in no-namespace.
Question: consider the Book element declaration after the Library schema
includes BookCatalogue.xsd:
<xsd:element name="Book" type="CardCatalogueEntry"/>
Is Book referencing CardCatalogueEntry in the default namespace (which
is the XMLSchema namespace), or is it referencing CardCatalogueEntry in
no-namespace? I believe that it is the former. In which case, the
simple solution to enabling coupled Chameleon components is case 2:
[2] The including schema has the targetNamespace as the default
namespace:
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2000/10/XMLSchema"
targetNamespace="http://www.library.org"
xmlns="http://www.library.org"
elementFormDefault="qualified">
<xsd:include schemaLocation="BookCatalogue.xsd"/>
<xsd:element name="Library">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="BookCatalogue">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="Book"/>
</xsd:sequence>
</xsd:complexType>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Note that the targetNamespace is the default namespace. When the
no-namespace components (Book and CardCatalogueEntry) are included in
this schema they take on the targetNamespace. Consequently, this
element declaration in the no-namespace schema:
<xsd:element name="Book" type="CardCatalogueEntry"/>
should be referencing a CardCatalogueEntry component in the
targetNamespace. Or, is Book still referencing CardCatalogueEntry in
no-namespace?
When I ran this example, using the scenario 2 schema, in XSV I got this
error message:
Undefined type {None}:CardCatalogueEntry referenced as type definition
of Book
This would seem to suggest that:
<xsd:element name="Book" type="CardCatalogueEntry"/>
is still referencing the CardCatalogueEntry in no-namespace (as opposed
to a reference to CardCatalogueEntry in the default namespace).
There are two possibilities:
{1} XSV has a bug and type="CardCatalogueEntry" is a reference to the
CardCatalogueEntry in the default namespace (which in my schema is the
targetNamespace)
{2} There is no bug in XSV and type="CardCatalogueEntry" is a reference
to the CardCatalogueEntry in no-namespace, and XSV's error message is
valid.
Note: if {1} is the case then it has tremendous implications on Best
Practices. /Roger
Received on Thursday, 22 February 2001 18:39:09 UTC