Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Including / importing local schemas that have namespaces

Tags:

xsd

Here is a schema file, midi.xsd that defines a type, note, used to store MIDI note values:

<?xml version="1.0" encoding="utf-8"?>

<xs:schema elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="note">
    <xs:restriction base="xs:integer">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="127"/>
    </xs:restriction>
  </xs:simpleType>

</xs:schema>

Here is another schema file, octaves.xsd which uses midi.xsd to help define the layout to be enforced on an XML file containing data about octaves:

<?xml version="1.0" encoding="utf-8"?>

<xs:schema elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:include schemaLocation="midi.xsd"/>

  <xs:element name="octaves">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="octave">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="name" type="xs:string" />

              <xs:element name="midi">
                <xs:complexType>
                  <xs:sequence>

                    <xs:element name="value" type="xs:integer" />
                    <xs:element name="from" type="note" />
                    <xs:element name="to" type="note" />

                  </xs:sequence>
                </xs:complexType>
              </xs:element>

            </xs:sequence>

            <xs:attribute name="index" type="xs:integer" />

          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>

This is fine, and works exactly as you would expect it to, except that I have another requirement: I want note to be in its own namespace, midi, so that

<xs:element name="from" type="note" />

becomes

<xs:element name="from" type="midi:note" />

Try as I might, I cannot get this to work. My attempts have included use of the targetNamespace attribute in various places, the import element, and liberal use of xmlns:midi="...", but to no avail. I'd post one of these attempts here, were it not so cringe-worthy.

Could some kind soul point me in the right direction? I'm pretty sure the problem is to do with the fact that midi.xsd is a local file; it has never been, and never will be, hosted on a web server.

like image 635
JimmidyJoo Avatar asked Mar 18 '12 16:03

JimmidyJoo


People also ask

What is schema namespace?

Figure 1: Elements and attributes in XML Schema namespace are used to write an XML Schema document, which generates elements and attributes as defined by user and puts them in {target namespace}. This {target namespace} is then used to validate the XML instance.

What is the difference between namespace and targetNamespace in XML?

The targetNamespace is the namespace that is going to be assigned to the schema you are creating or the namespace that this schema is intended to target, or validate. It is the namespace an instance is going to use to access the types it declares.

How do you add multiple namespaces in xsd?

You have to use two schemas. one schema per namespace. you have to use xsd:import to bring in an XSD from a different namespace. You have to Validate the xml document using only the main schema (mc.


1 Answers

Change midi.xsd to be:

<xs:schema elementFormDefault="qualified"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       targetnamespace="/my/midi/namespace">

And then change octaves.xsd to say:

<xs:schema elementFormDefault="qualified"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:midi="/my/midi/namespace">

   <xs:import namespace="/my/midi/namespace" schemaLocation="midi.xsd"/>

   ...

   <xs:element name="from" type="midi:note" />

Note the use of xs:import rather than <xs:include> The two are very different - you use import for bringing in other namespaces, and include for inline inclusion of other schema files into the current namespace.

Note also that /my/midi/namespace can be anything you want, it's an arbitrary identifier.

I'm pretty sure the problem is to do with the fact that midi.xsd is a local file

Nope, not relevant.

like image 51
skaffman Avatar answered Oct 15 '22 04:10

skaffman