2つのxsdファイルがあります。最初のファイルはcommon.xsd
で、もう1つはですnode.xsd
。両方node.xsd
とcommon.xsd
同じを共有しtargetNamespace
ます。using属性で定義されたをcommon.xsd
参照します。ただし、またはのいずれにも含まれていません。しかし、これらのxsdファイルを使用して検証したXMLは、検証に合格します(すべてのコーナーのユースケースを試しました)。element
node.xsd
ref
node.xsd
common.xsd
include
import
どうしてこれが可能かしら。これは、同じ名前空間を共有しているためですか?またelement
、XSDに合法的なものを含めたりインポートしたりせずに参照していますか?
編集:
簡略化されたコードスニペット(実際のxsdははるかに複雑であり、より大きな理由でこの形式で記述されています):
common.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:my="my-namespace"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
targetNamespace="my-namespace"
elementFormDefault="qualified">
<xsd:element name="common" type="my:commonType" />
<xsd:complexType name="commonType">
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="my:node"/>
<!-- few other elements -->
</xsd:choice>
</xsd:complexType>
</xsd:schema>
node.xsd
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:my="my-namespace"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
targetNamespace="my-namespace"
elementFormDefault="qualified">
<xsd:include schemaLocation=common.xsd"/>
<xsd:element name="node" type="my:nodeType"
substitutionGroup="my:common" />
<xsd:complexType name="nodeType">
<xsd:complexContent>
<xsd:extension base="my:commonType">
<!-- some 5-7 attributes -->
<xsd:anyAttribute/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
これらのxsdを使用すると、要素を何度でもネストできます。例えば
<my:node>
<my:node />
<my:node>
<my:node />
</my:node>
</my:node>
を含めずmy:node
にで参照されていることを確認できます。(これがどのように機能するかについても興味があります。)common.xsd
node.xsd