2

XSD のセットを定義する必要があります。各 XSD にはヘッダー要素があり、そのヘッダーは中央のいくつかの要素を除いて同一です。

だから、私は持っているでしょう:

xml1:

<req1>
    <head>
        <common1/>
        <common2/>
        <choice1/>
        <choice2/>
        <common3/>
    </head>
    <data1>...</data1>
</req1>

xml2:

<req2>
    <head>
        <common1/>
        <common2/>
        <choice2/>
        <choice3/>
        <common3/>
    </head>
    <data2>...</data2>
</req2>

ここで、choice1、choice2、choice3 は次の<choice>ようにセットになっています

<choice>
    <choice2/>
    <choice3/>
</choice>

また、異なるリクエスト タイプ間で異なる選択肢と要素数を持つことができます。

これをヘッダー用の 1 つの XSD で定義し、それを req1.xsd と req2.xsd に含めたいと思っています。<choice>これを動的に交換する方法がわかりません。パーツがない場合は<common3/>、ベース要素を使用できますが、ベースに何かを追加すると、最後にのみ追加されると理解しています。ベースを使用しているときに、途中で交換したり、途中で追加したりできる方法はありますか?

4

1 に答える 1

3

これを行う 1 つの方法は、置換グループを使用することです。ボイラープレートのベース XSD を定義します。

Base.xsd

<?xml version="1.0" encoding="utf-8"?>
<!--W3C Schema generated by QTAssistant/XML Schema Refactoring Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="head">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="common1" type="xsd:anyType"/>
                <xsd:element name="common2" type="xsd:anyType"/>
                <xsd:element ref="headerPlaceholder"/>
                <xsd:element name="common3" type="xsd:anyType"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="headerPlaceholder" type="headerPlaceholder" abstract="true"/>
    <xsd:complexType name="headerPlaceholder" abstract="true"/>
    <xsd:complexType name="request" abstract="true">
        <xsd:sequence>
            <xsd:element ref="head"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

その後、req1 と req を個別に構築できます。

Req1.xsd

<?xml version="1.0" encoding="utf-8"?>
<!--W3C Schema generated by QTAssistant/XML Schema Refactoring Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:include schemaLocation="SubstitutionGroupHeader.xsd"/>

    <xsd:element name="req1" type="req1"/>
    <xsd:complexType name="req1">
        <xsd:complexContent>
            <xsd:extension base="request">
                <xsd:sequence>
                    <xsd:element name="data1"/>
                </xsd:sequence>         
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="choice1" substitutionGroup="headerPlaceholder">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="headerPlaceholder"/>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>

    <xsd:element name="choice2" substitutionGroup="headerPlaceholder">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="headerPlaceholder"/>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>  
</xsd:schema>

構造は次のようになります。

要件 1

Req2.xsd

<?xml version="1.0" encoding="utf-8"?>
<!--W3C Schema generated by QTAssistant/XML Schema Refactoring Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:include schemaLocation="SubstitutionGroupHeader.xsd"/>

    <xsd:element name="req2" type="req2"/>
    <xsd:complexType name="req2">
        <xsd:complexContent>
            <xsd:extension base="request">
                <xsd:sequence>
                    <xsd:element name="data2"/>
                </xsd:sequence>         
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element name="choice3" substitutionGroup="headerPlaceholder">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="headerPlaceholder"/>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>

    <xsd:element name="choice4" substitutionGroup="headerPlaceholder">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="headerPlaceholder"/>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>  
</xsd:schema>

req2 の構造:

要件 2

内容が重複しないように、choice1/2 と choice3/4 を req1 と req2 に入れました。したがって、ファイル構造は次のようになります。

XSD ファイルの関係

XSD コンポーネント間の全体的な関係:

QTAssistant XSD コンポーネント関係図

req1 と req2 の両方から同じ choice2 を参照したい場合は、choice2 を独自のファイルでリファクタリングする必要があります。

選択肢と代替グループについては多くの議論ができますが、それは別のことです...

于 2012-04-20T23:12:08.707 に答える