0

ある種の入力データの形式を定義する AdapterInputDataType という名前の型があります。

<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://companyname.org/AdapterInputDataTypeNS"
        xmlns:tns="http://companyname.org/AdapterInputDataTypeNS"
>

    <complexType name="AdapterInputDataType">
        <sequence>
            <element name="atomicElement" type="tns:AtomicElementType" minOccurs="0" maxOccurs="unbounded"/>
        </sequence>
    </complexType>

    <complexType name="AtomicElementType">
        <simpleContent>
            <extension base="tns:AtomicElementValueType">
                <attribute name="elementName" type="tns:AtomicElementNameType" use="required"/>
            </extension>
        </simpleContent>
    </complexType>

    <simpleType name="AtomicElementValueType">
        <union memberTypes="string long decimal dateTime boolean"/>
    </simpleType>

    <simpleType name="AtomicElementNameType">
        <restriction base="string">
            <enumeration value="foo"/>
            <enumeration value="bar"/>
            <enumeration value="baz"/>
        </restriction>
    </simpleType>

</schema>

AdapterInputDataType は、いくつかの名前空間内でこの型の要素を定義することを目的としています。

<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://companyname.org/adapter1"
        xmlns:tns="http://companyname.org/adapter1"
        xmlns:inptypns="http://companyname.org/AdapterInputDataTypeNS"
>

    <import namespace="http://companyname.org/AdapterInputDataTypeNS"/>

    <element name="adapterInputData" type="inptypns:AdapterInputDataType"/>

</schema>

<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://companyname.org/adapter2"
        xmlns:tns="http://companyname.org/adapter2"
        xmlns:inptypns="http://companyname.org/AdapterInputDataTypeNS"
>

    <import namespace="http://companyname.org/AdapterInputDataTypeNS"/>

    <element name="adapterInputData" type="inptypns:AdapterInputDataType"/>

</schema>

問題は、名前空間ごとに、要素名属性の特定の許可された値のセットに型がインポートされることです。定義する必要があります。つまり、異なる名前空間では、 AdapterInputDataType は異なる AtomicElementNameType タイプに基づく必要があります。

AdapterInputDataType 定義で AtomicElementNameType の代わりにある種のパラメータを使用し、このパラメータの値として異なる名前空間に異なる AtomicElementNameType タイプを配置する方法はありますか?

4

2 に答える 2

2

代替グループの場合のように思えます。

abstract="true" を使用して、atomicAlement をグローバル要素宣言として定義します。次に、さまざまなメッセージ固有のスキーマ ドキュメントで、substitutionGroup="tns:atomicElement" を使用して具体的な要素を定義し、それらを抽象要素の代わりに使用できるようにします。具象要素の型は、抽象要素の型と同じか、抽象要素の型から派生している必要があります。これは多くの場合、抽象要素 type="xs:anyType" を指定することによって実現されます。

于 2013-05-14T07:10:52.707 に答える
0

解決策を見つけました (置換基に関するヒントを提供してくれた Michael Kay に感謝します)。

<schema xmlns="http://www.w3.org/2001/XMLSchema"
                targetNamespace="http://companyname.org/AdapterInputDataTypeNS"
                xmlns:tns="http://companyname.org/AdapterInputDataTypeNS"
>
        <import namespace="http://companyname.org/adapter1" schemaLocation="adapter1/ElementName.xsd"/>
        <import namespace="http://companyname.org/adapter2" schemaLocation="adapter2/ElementName.xsd"/>

        <element name="adapterInputData" type="tns:AdapterInputDataType" />

        <complexType name="AdapterInputDataType">
                <sequence>
                        <element name="atomicElement" type="tns:AtomicElementType" minOccurs="0" maxOccurs="unbounded"/>
                </sequence>
        </complexType>

        <complexType name="AtomicElementType">
                <sequence>
                        <element ref="tns:elementName" minOccurs="1" maxOccurs="1"/>
                        <element name="elementValue" type="tns:AtomicElementValueType" minOccurs="1" maxOccurs="1"/>
                </sequence>
        </complexType>

        <simpleType name="AtomicElementValueType">
                <union memberTypes="string long decimal dateTime boolean"/>
        </simpleType>

        <element name="elementName" type="string" abstract="true"/>

</schema>

<schema xmlns="http://www.w3.org/2001/XMLSchema"
                targetNamespace="http://companyname.org/adapter1"
                xmlns:tns="http://companyname.org/adapter1"
                xmlns:inptypns="http://companyname.org"
>

        <element name="elementName" type="tns:AtomicElementNameType" substitutionGroup="inptypns:elementName"/>

        <simpleType name="AtomicElementNameType">
                <restriction base="string">
                        <enumeration value="foo"/>
                        <enumeration value="bar"/>
                </restriction>
        </simpleType>

</schema>

<schema xmlns="http://www.w3.org/2001/XMLSchema"
                targetNamespace="http://companyname.org/adapter2"
                xmlns:tns="http://companyname.org/adapter2"
                xmlns:inptypns="http://companyname.org"
>

        <element name="elementName" type="tns:AtomicElementNameType" substitutionGroup="inptypns:elementName"/>

        <simpleType name="AtomicElementNameType">
                <restriction base="string">
                        <enumeration value="baz"/>
                </restriction>
        </simpleType>

</schema>

AtomicElementType元の投稿のものに対して少し変更されています。属性は子要素elementNameに置き換えられました。elementName原因は、属性を抽象として宣言できないことです。このスキーマに対して有効なデータの例を次に示します。

<ans:adapterInputData xmlns:ans="http://companyname.org">
        <atomicElement>
                <ans1:elementName xmlns:ans1="http://companyname.org/adapter1">foo</ans1:elementName>
                <elementValue>hello</elementValue>
        </atomicElement>
        <atomicElement>
                <ans2:elementName xmlns:ans2="http://companyname.org/adapter2">baz</ans2:elementName>
                <elementValue>123</elementValue>
        </atomicElement>
</ans:adapterInputData>
于 2013-05-14T17:11:35.690 に答える