要件は、xsdで定義された一部の要素のみをルート要素としてアクセスできるようにすることです。したがって、そのためのアプローチは、複合型を宣言してそれらを参照することにより、他のすべての要素をローカルにすることです。
ただし、アクセスできない要素またはローカル要素が別のxsd定義で必要な場合、つまり*、それらは別のxsdで定義された他の名前空間に属する要素の子要素である可能性があります。
この種のスキーマ定義を実現するにはどうすればよいですか?
たとえば、次のように、A:rootとcustom:rootだけをinner:Aではなく有効なルートにしたいので、root要素の下でinnerAを宣言し、型を参照しましたが、A:innerAは要素の下に入ることができますか?
B.xsdでinnerAを定義することはできません。bczを使用すると、innerAがB.xsdのターゲット名前空間(カスタム名前空間)に配置されます。
例えば
A.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
targetNamespace="http://www.abc.com/custom"
xmlns:A="http://www.abc.com/A"
xmlns:custom="http://www.abc.com/custom">
<xsd:import namespace="http://www.abc.com/custom"
schemaLocation="B.xsd"/>
<xsd:complexType name="innerType">
<xsd:sequence>
<xsd:element name="abc" type="xs:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="root">
<xsd:complexType mixed="true">
<xsd:choice>
<xsd:element ref="custom:root">
<xsd:element name="innerA" type="A:innerType"/>
</xsd:choice>
</xsd:complexType>
</xsd:element>
B.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
targetNamespace="http://www.abc.com/custom"
xmlns:A="http://www.abc.com/A"
xmlns:custom="http://www.abc.com/custom">
<xsd:import namespace="http://www.abc.com/A"
schemaLocation="A.xsd"/>
<xsd:element name="root">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:element ref="A:innerA"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
上記のB.xsdの最後から4番目の行でエラーが発生します。どうすればinnerA要素を参照できますか。何か提案はありますか?
XML
<A:root xmlns:A="http://www.abc.com/a" xmlns:custom="http://www.abc.com/custom"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=""http://www.abc.com/a "http://www.abc.com/a/A.xsd">
<custom:root>
<A:innerA>
<A:abc>
</A:innerA>
</custom:root>
</A:hello>