異なるドキュメントを定義している2つのXSDがあります。たとえば、A.xsd
は要素ElementA
をルートとして定義し、いくつかの複雑なルールがあります。ここでB.xsd
は、ElementB
をどこかで使用することになっている要素ElementA
を定義します。
たとえば、ElementB
のXMLファイルは次のようにします。
<?xml version="1.0" encoding="utf-8"?>
<ElementB xmlns="http://example.com/namespace/for/ElementB">
<foo>Bla</foo>
<bar>Blub</bar>
<ElementA xmlns="http://example.com/namespace/for/ElementA">
<!-- ... -->
</ElementA>
</ElementB>
その場合、B.xsd
は次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns="http://example.com/namespace/for/ElementB" targetNamespace="http://example.com/namespace/for/ElementB" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="ElementB">
<xs:complexType>
<xs:sequence>
<xs:element name="foo" type="xs:string" />
<xs:element name="bar" type="xs:string" />
<!-- And now I want to include ElementA somehow -->
<xs:element name="ElementA" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
重要なのは、ElementA
の仕様をB.xsd
に複製したくないということです。これは、ルートとしてElementA
を持つドキュメントもあるためです(つまり、ElementB
はある種のコンテナドキュメントです)。
では、既存のXSDの上に完全に構築しながら、ElementA
内でElementB
を許可するにはどうすればよいですか?
XMLスキーマドキュメントを作成するには、実際には<xs:import>
と<xs:include>
の2つの方法があります。 xs:includeは、含まれているドキュメントの名前空間が参照されている名前空間と同じである場合に使用することを目的としているため、探しているものとはまったく異なります。 xs:importは、参照されるスキーマの要素のすべて(またはサブセット)を参照する必要があり、それらが異なるターゲット名前空間にある場合に適しています。違いについてここに質問があります: xsd:includeとxsd:importの違いは何ですか? 。
とにかく、この特定の質問に戻ります。おそらくあなたが望むのはこのようなものです:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema
xmlns="http://example.com/namespace/for/ElementB"
targetNamespace="http://example.com/namespace/for/ElementB"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
xmlns:ea="http://example.com/namespace/for/ElementA">
<xs:import namespace="http://example.com/namespace/for/ElementA" schemaLocation="A.xsd" />
<xs:element name="ElementB">
<xs:complexType>
<xs:sequence>
<xs:element name="foo" type="xs:string" />
<xs:element name="bar" type="xs:string" />
<!-- This introduces a element named ElementA that uses the ComplexType ea:ElementA defined in A.xsd -->
<xs:element name="ElementA" type="ea:ElementA" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
ただし、次に示すように、B.xsdで使用できるElementAの複合型を作成するには、A.xsdが必要です。
このアークティクルにはいくつかの優れた情報/例があり、さまざまな構成可能性戦略のいくつかの議論が含まれています。 http://www.xfront.com/ZeroOneOrManyNamespaces.html
<xsd:import>
タグを使用して、別の名前空間のスキーマをインポートします。