2 番目のレベルをインポートし、3 番目のレベルをインポートする最上位の xsd を考えると、最初のレベルで 3 番目のタイプを使用することは可能ですか? それとも、最初のものは3番目のものを直接インポートする必要がありますか?
2 に答える
良い質問!スペックを読んでみると、よくわかりません。推移的なインポートの問題に明示的に対処していません。
入門書(パート0)では、インポートの1つのレベルについてのみ説明しています:http ://www.w3.org/TR/xmlschema-0/#import
構造(パート1)では、直接インポートのみを定義しますhttp://www.w3.org/TR/2004/REC-xmlschema-1-20041028/structures.html#composition-schemaImportそのような外部コンポーネントのアドレス指定」(これは名前空間を意味すると思います)、インポートされたスキーマをアドレス指定する明示的な方法が必要であると想定するのは合理的かもしれません。つまり、インポートでの明示的な名前空間がそれぞれに必要です。
グーグル検索は、他の人々もこの問題によって混乱していることを示しています:
これらの投稿で最も懸念されるのは、xsdプロセッサが異なれば動作も異なることです。これは、プロセッサの作成者も混乱していることを示唆しています。
これらの投稿(2002、2005)以降、変更されている可能性がありますが、すべてのプロセッサで機能するため、この問題を回避し、直接インポートを使用するのが最も賢明な方法のようです。
私が言ったように:良い質問です。
これがxsdプロセッサをチェックするためのテストです(もちろん、これは他のxsdプロセッサを使用している他の誰かのために動作することを保証するものではありません...)。私のお気に入りのもの(xmllint)は推移的なインポートを許可していないことがわかりました。
テストは3つのスキーマです。a.xsdはb.xsdをインポートし、b.xsdはc.xsdをインポートします。c.xsdで定義された型は、a.xsdから参照されます。
<!-- a.xsd -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:c="http://www.c.com" targetNamespace="http://www.a.com">
<xsd:import namespace="http://www.b.com" schemaLocation="b.xsd"/>
<!-- UNCOMMENT FOR DIRECT IMPORT
<xsd:import namespace="http://www.c.com" schemaLocation="c.xsd"/>
-->
<xsd:element name="eg" type="c:TypeC"/>
</xsd:schema>
<!-- b.xsd -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="http://www.c.com" schemaLocation="c.xsd"/>
</xsd:schema>
<!-- c.xsd -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.c.com">
<xsd:simpleType name="TypeC">
<xsd:restriction base="xsd:string"/>
</xsd:simpleType>
</xsd:schema>
<!-- a.xml -->
<eg xmlns="http://www.a.com">hello world</eg>
$ xmllint --schema a.xsd a.xml --noout
a.xsd:6: element element: Schemas parser error : Element
'{http://www.w3.org/2001/XMLSchema}element', attribute 'type': References from
this schema to components in the namespace 'http://www.c.com' are not allowed,
since not indicated by an import statement.
WXS schema a.xsd failed to compile
エラーメッセージは次のとおりです。 、xmllintの開発者は、少なくともインポートが推移的ではないReferences from this schema to components in the namespace 'http://www.c.com' are not allowed, since not indicated by an import statement.
ことを確信していることを示唆しています。
あなたtype
が話しているのであれば..そうでは<xs:Include>
ありません<xs:Import>
..
答えは次のとおりです。パーサーはすべての XSD を一緒にリンクします。
以下の例を参照してください。
<?xml version="1.0" encoding="utf-8"?>
<root>
<child>trial</child>
<child2>trial2</child2>
<trunk>
<branch>1</branch>
<branch>2</branch>
</trunk>
<specialchild>test</specialchild>
</root>
上記の XML に対して、XSD を設計します。
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="include multiple XSDs2.xsd"/>
<xs:element name="root" type ="root"/>
<xs:complexType name="root">
<xs:sequence>
<xs:element name="child" type="xs:string" />
<xs:element name="child2" type="xs:string" />
<xs:element name="trunk" type="trunk"/>
<xs:element name="specialchild" type="specialchild"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
ここで、タイプ トランクはimport multiple XSDs2.xsd
ファイルで定義され、.. を使用してリンクされ<xs:include>
ます (同じフォルダーに存在します)。コードは次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="include multiple XSDs3.xsd"/>
<xs:complexType name="trunk">
<xs:sequence>
<xs:element maxOccurs="unbounded" name="branch" type="branch" />
</xs:sequence>
</xs:complexType>
</xs:schema>
タイプブランチはinclude multiple XSDs3.xsd
ファイルで定義された単純なタイプで、コードは次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="branch">
<xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="specialchild">
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:schema>
*ここでトリッキーな部分は次のとおりです: specialchild
is defined in XSD_1
where as defined in でXSD_3
あり、これら 2 つの XSD は . によってリンクされていXSD_2
ます。パーサーはデフォルトで、すべての XSD をリンクし、それらすべてを 1 つとして処理することを確認できます! *
これであなたの質問が解決することを願っています!