1

以下は、xsd ファイルに対して検証する必要がある xml ファイルです。

XML ファイル 1

<ROOT  ElementType="1" >
    <ELEMENT_ONE>
        .
        .
        .
    </ELEMENT_ONE>
    <ELEMENT_ONE>
        .
        .
        .
    </ELEMENT_ONE>
</ROOT>

XML ファイル 2

<ROOT  ElementType="2" >
    <ELEMENT_TWO>
        .
        .
        .
    </ELEMENT_TWO>
    <ELEMENT_TWO>
        .
        .
        .
    </ELEMENT_TWO>
</ROOT>

XML ファイル 3

<ROOT  ElementType="3" >
    <ELEMENT_THREE>
        .
        .
        .
    </ELEMENT_THREE>
</ROOT>

XML ファイル 4

<ROOT  ElementType="4" >
    <ELEMENT_FOUR>
        .
        .
        .
    </ELEMENT_FOUR>
</ROOT>

XML ファイル 5

<ROOT  ElementType="5" >
    <ELEMENT_FIVE>
        .
        .
        .
    </ELEMENT_FIVE>
</ROOT>

XML ファイル 6

<ROOT  ElementType="6" >
    <ELEMENT_ONE>
        .
        .
        .
    </ELEMENT_ONE>
    <ELEMENT_TWO>
        .
        .
        .
    </ELEMENT_TWO>
    <ELEMENT_FIVE>
        .
        .
        .
    </ELEMENT_FIVE>
    <ELEMENT_ONE>
        .
        .
        .
    </ELEMENT_ONE>
    <ELEMENT_TWO>
        .
        .
        .
    </ELEMENT_TWO>
</ROOT>

以下は、上記の xml ファイルを検証する必要がある xsd ファイルです。

<xsd:element name = "ROOT">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:choice>
                <xsd:element ref = "agent:ELEMENT_ONE"  minOccurs = "1" maxOccurs = "unbounded"/>
                <xsd:element ref = "agent:ELEMENT_TWO"  minOccurs = "1" maxOccurs = "unbounded"/>
                <xsd:element ref = "agent:ELEMENT_THREE"  minOccurs = "1" maxOccurs = "1"/>
                <xsd:element ref = "agent:ELEMENT_FOUR"  minOccurs = "1" maxOccurs = "1"/>
                <xsd:element ref = "agent:ELEMENT_FIVE"  minOccurs = "1" maxOccurs = "1"/>
            </xsd:choice>
        </xsd:sequence>

        <xsd:attribute name = "ElementType" use = "required">
            <xsd:simpleType>
                <xsd:restriction base="xsd:integer">
                    <xsd:enumeration value="1"/>
                    <xsd:enumeration value="2"/>
                    <xsd:enumeration value="3"/>
                    <xsd:enumeration value="4"/>
                    <xsd:enumeration value="5"/>
                    <xsd:enumeration value="6"/>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:attribute>

上記の xsd 検証は、ケース 1 から 5 で正常に機能します。XML ファイル 6 には、任意の数の ELEMENT_ONE または ELEMENT_TWO または 1 つの ELEMENT_FIVE を含めることができます。ケース 6 を xsd 検証に含めるにはどうすればよいですか?

ケース 6 をこの xsd ファイルに含めることができない場合、上記のシナリオを処理するためのより良いスキーマはありますか?

フィードバックをお寄せいただきありがとうございます。

4

1 に答える 1

0

<ROOT>XSD 1.0 では、定義された属性の値に基づいてスキーマを制限する方法はありませんElementType。問題は、定義の一部として単語自体を使用して単語を定義しようとすることに似ています。

あなたができる最善のことは次のとおりです。

<xsd:element name = "ROOT">
    <xsd:complexType>
        <xsd:choice>
            <xsd:sequence>
                <xsd:choice>
                    <xsd:element ref="agent:ELEMENT_ONE" minOccurs="1" maxOccurs="unbounded"/>
                    <xsd:element ref="agent:ELEMENT_TWO" minOccurs="1" maxOccurs="unbounded"/>
                    <xsd:element ref="agent:ELEMENT_THREE" minOccurs="1" maxOccurs="1"/>
                    <xsd:element ref="agent:ELEMENT_FOUR" minOccurs="1" maxOccurs="1"/>
                    <xsd:element ref="agent:ELEMENT_FIVE" minOccurs="1" maxOccurs="1"/>
                </xsd:choice>
            </xsd:sequence>
            <xsd:sequence>
                <xsd:element ref="agent:ELEMENT_ONE" minOccurs="0" maxOccurs="unbounded" />
                <xsd:element ref="agent:ELEMENT_TWO" minOccurs="0" maxOccurs="unbounded" />
                <xsd:element ref="agent:ELEMENT_FIVE" minOccurs="1" maxOccurs="1" />
            </xsd:sequence>
        </xsd:choice>

        <xsd:attribute name = "ElementType" use = "required">
            <xsd:simpleType>
                <xsd:restriction base="xsd:integer">
                    <xsd:enumeration value="1"/>
                    <xsd:enumeration value="2"/>
                    <xsd:enumeration value="3"/>
                    <xsd:enumeration value="4"/>
                    <xsd:enumeration value="5"/>
                    <xsd:enumeration value="6"/>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:attribute>
    </xsd:complexType>
</xsd:element>

ElementType次に、提供された属性の値に基づいて「正しいスキーマ」が使用されていることを個別に検証する必要があります。

あなたがやりたいことは、XSD 1.1で可能かもしれないことに注意してください。

于 2013-05-21T16:51:05.420 に答える