Search code examples
javaxmlxsdsax

how to import XSD types into root schema?


This is my existing XSD schema in foo.xsd, that declares just the type:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"
  targetNamespace="foo">
  <xs:complexType name="alpha">
    <!-- skipped -->
  </xs:complexType>
</xs:schema>

This is another schema, that declares the element:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"
  targetNamespace="foo">
  <xs:import schemaLocation="foo.xsd" namespace="foo" />
  <xs:element name="RootElement" type="alpha"/>
</xs:schema>

This is what I'm getting from SAX parser in Java:

"The namespace attribute 'foo' of an <import> element information 
item must not be the same as the targetNamespace of the schema it exists in."

What am I doing wrong?


Solution

  • When the targetNamespace (tns) attributes of the involved XSDs are specified and the same, only xsd:include is allowed (a targetNamespace attribute cannot have empty string as its value).

    However, one may include a schema (s1) without a tns from a schema (s2) that has a tns; the net effect is s1 components assume the namespace of the s2 schema. This usage is often referred to as chameleonic composition.

    A reference on SO describing the difference between the two, is here.