Schema Design for common global element

G

Gordon Dickens

I have target xml to generate from schema. All of the XML instances
have the same global element i.e. <base>. I would like to combine all
of the schemas into a single schema where I could generate any of the
specific instances.

sample schema one:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="base">
<xs:complexType>
<xs:attribute name="myNodeABC" type="xs:string"/>
<xs:attribute name="myNodeDEF" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>

sample schema two:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="base">
<xs:complexType>
<xs:attribute name="myNodeABC" type="xs:string"/>
<xs:attribute name="myNodeXYZ" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>

Can anyone suggest how to join these two into a single schema where
the instance document does not have namespace prefixed
elements/attributes?

I tried attributeGroups, groups, import and include elements, without
any luck.

Any help is appreciated.

Thanks,
Gordon
 
I

Ingrid

Hi Gordon

Had a similar problem and it took me ages to sort something out (just
writing a dissertation about DTD vs Schema use..)

This is what worked for me, but I am not an expert so my solution
might not be how it should be done...

Sample Schema 1 (file: untitled8.xsd):

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:in="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:import namespace="http://www.w3.org/2001/XMLSchema"
schemaLocation="untitled9.xsd"></xs:import>
<xs:element name="base">
<xs:complexType>
<xs:sequence>
<xs:element ref="in:base"></xs:element>
</xs:sequence>
<xs:attribute name="myNodeABC"></xs:attribute>
<xs:attribute name="myNodeDEF"></xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>
which is your main Schema, note the <xs:import> tag, which references
the location of your "to be imported" element (here in the same
directory so just referenced "untitled9.xsd"). Also note above the
<xs:import> - tag a new xmlns namespace abbreviation is introduced
ie... xmlns:in - this is because I have given your second Schema a new
namespace prefix (in)...:

Sample Schema 2: This is the "to be imported" schema (my doc called
untitled9.xsd - referenced in Schema 1 in the <xs:import> tag) with
the new namespace prefix in:

<?xml version="1.0" encoding="UTF-8"?>
<in:schema xmlns:in="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<in:element name="base">
<in:complexType>
<in:attribute name="myNodeABC" type="in:string"/>
<in:attribute name="myNodeXYZ" type="in:string"/>
</in:complexType>
</in:element>
</in:schema>

The resulting XML instance document:

<?xml version="1.0" encoding="UTF-8"?>
<base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="file:untitled8.xsd"
myNodeABC="" myNodeDEF="">
<base xmlns="http://www.w3.org/2001/XMLSchema"
myNodeABC="" myNodeXYZ="">Content of base element of Schema 2
nested in the base element of Schema 1 </base>
</base>

By the way, I used the oXygen XML editor for this, for some reason
Altova's XML Spy does not like my new namespace prefix... but oXygen
validates it all..

Again, this might be complete gibberish but I hope it helps..

Cheers
Ingrid

PS let me know what you think of it anyway, might be helpful for my
dissertation to know if I am thinking on the right lines..And if you
find an easier way to do it, could you please post it??
 
I

Ingrid

Re my answer below...

Even better than that: SCHEMA 1 (Untitled8.xsd):

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:in="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" targetNamespace="http://Untitled8">
<xs:import namespace="http://Untitled9/in"
schemaLocation="untitled9.xsd"></xs:import>
<xs:element name="base">
<xs:complexType>
<xs:sequence>
<in:element name="base">
<in:complexType>
<in:attribute name="myNodeABC" type="in:string"/>
<in:attribute name="myNodeXYZ" type="in:string"/>
</in:complexType></in:element>
</xs:sequence>
<xs:attribute name="myNodeABC"></xs:attribute>
<xs:attribute name="myNodeDEF"></xs:attribute>
</xs:complexType>
</xs:element>
</xs:schema>


SCHEMA 2 (Untitled9.xsd):

<?xml version="1.0" encoding="UTF-8"?>
<in:schema xmlns:in="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://Untitled9/in"
elementFormDefault="qualified">
<in:element name="base">
<in:complexType>
<in:attribute name="myNodeABC" type="in:string"/>
<in:attribute name="myNodeXYZ" type="in:string"/>
</in:complexType>
</in:element>
</in:schema>

Resulting XML doc:

<?xml version="1.0" encoding="UTF-8"?>
<base xmlns="http://Untitled8"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://Untitled8
file:/C:/Documents%20and%20Settings/Ingrid/Desktop/Untitled8.xsd"
myNodeABC="" myNodeDEF="">
<base myNodeABC="" myNodeXYZ="">SCHEMA 2 content </base>
</base>

Ingrid

So the solution below is probably not strictly speaking the correct
way...
 
G

Gordon Dickens

Thank you everyone for your help. Here is what I needed to do (a lot
simpler than I thought)... just add "targetNamespace" to the
definition for each XML schema document with a unique value.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://Untitled8/in"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="base">
<xs:complexType>
<xs:attribute name="myNodeABC" type="xs:string"/>
<xs:attribute name="myNodeXYZ" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://Untitled9/in"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="base">
<xs:complexType>
<xs:attribute name="myNodeABC" type="xs:string"/>
<xs:attribute name="myNodeXYZ" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>

Thanks again.

Regards,
Gordon Dickens


------------------------------------------------------------------------
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,022
Latest member
MaybelleMa

Latest Threads

Top