I have a schema here where I am trying to include/import another schema that has no namespace (and this cannot be changed because it comes from another vendor and it would no longer validate their XML). Here is the first Schema:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:samp="http://sample/namespace"
targetNamespace="http://sample/namespace"
elementFormDefault="unqualified" attributeFormDefault="unqualified"
xmlns:otr1="http://sample/import/namespace1"
xmlns:otr2="http://sample/import/namespace2">
<xs:import namespace="http://sample/import/namespace1" schemaLocation="other1.xsd" />
<xs:import namespace="http://sample/import/namespace2" schemaLocation="other2.xsd" />
<!-- This one below is having problems, it is valid XML, and I am able to use it
but I am not meeting the actual requirments I have (explained later) -->
<xs:include schemaLocation=="NO_NAME_SPACE_PROBLEM.xsd"/>
...
<xs:element ref="some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA"/>
...
</xs:schema>
And the "NO_NAME_SPACE_SHEMA_PROBLEM.xsd" which can be changed to some extent, but it cannot have namespace.
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="unqualified" attributeFormDefault="unqualified">
<xsd:element name="some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA"
type="xsd:string" nillable="true"/>
</xs:schema>
The problem is that the some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA
is being put into the samp
namespace. So when I try to marshall this to XML it prints out <samp:some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA><child-elem/></samp:some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA>
which is a big problem because that XML will not validate since it isn't meant to have. So my goal is to simply import elements into the no-namespace namespace.
Update 1: Sorry for the confusion, I was and am using xs:include, not xs:import for the no-namespace schema. Question syntax has been updated. I am also using JiBX codegen to generate domain objects and JiBX binding for marshalling. So it it must be JiBX compatible too.
Update 2: As per skaffman's answer, I will now be using xs:import. I think I will be branching this into a new question.
Have you tried
<xs:import namespace="" schemaLocation="NO_NAME_SPACE_PROBLEM.xsd"/>
Interesting, the XML Schema spec strongly suggests that
<xs:import schemaLocation="NO_NAME_SPACE_PROBLEM.xsd"/>
should import NO_NAME_SPACE_PROBLEM.xsd
into the "no namespace". If your environment is instead importing it into the enclosing schema document's namespace, then I'm pretty sure that's a bug in your platform.
update: OK, your update says you're trying to use <xs:include>
to refer to types in a different namespace. You can't do this - <xs:include>
always brings the included items into the same namespace as the parent schema document. If they're for a different namespace, you must use <xs:import>
.
If you want to refer to one of the element definitions in the imported no-namespace schema, then you need to find a way of assigning a prefix to the "no namespace" namespace. If it had a prefix, you could refer to them like this:
<xs:element ref="nn:some-elem-from-NO_NAME_SPACE_PROBLEM_SCHEMA"/>
Try adding the attribute xmlns:nn=""
to the parent schema document, see if that works.