包含/导入具有命名空间的本地模式

时间:2012-03-18 16:30:51

标签: xsd

这是一个模式文件midi.xsd,用于定义用于存储MIDI音符值的类型note

<?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>

这是另一个模式文件octaves.xsd,它使用midi.xsd帮助定义要在包含八度数据的XML文件上强制执行的布局:

<?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>

这很好,并且完全按照您的预期工作,除了我有另一个要求:我希望note位于自己的命名空间midi中,以便

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

变为

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

尽我所能,我无法让它发挥作用。我的尝试包括在各个地方使用targetNamespace属性,import元素以及xmlns:midi="..."的自由使用,但无济于事。我会在这里发布其中一个尝试,如果它不是那么令人畏缩。

某种善良的灵魂会指向正确的方向吗? 我很确定问题与midi.xsd是本地文件的事实有关;它从来没有,也永远不会在网络服务器上托管。

1 个答案:

答案 0 :(得分:5)

midi.xsd更改为:

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

然后更改octaves.xsd说:

<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" />

请注意使用xs:import而不是<xs:include>这两者非常不同 - 您使用import来引入其他名称空间,使用include来内联其他模式文件到当前命名空间。

另请注意,/my/midi/namespace可以是您想要的任何内容,它是一个任意标识符。

  

我很确定问题与midi.xsd是本地文件的事实有关

不,不相关。