web-dev-qa-db-ja.com

他の名前空間の要素を持つXSD

異なるドキュメントを定義している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を許可するにはどうすればよいですか?

21
poke

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

33
daveaglick

<xsd:import>タグを使用して、別の名前空間のスキーマをインポートします。

1