这是一个模式文件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
是本地文件的事实有关;它从来没有,也永远不会在网络服务器上托管。
答案 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是本地文件的事实有关
不,不相关。