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 或只有一个 ELEMENT_FIVE。如何在 xsd 验证中包含案例 6?

如果我不能在这个 xsd 文件中包含案例 6,那么是否有更好的模式来处理上述情况?

提前感谢大家的反馈。

4

1 回答 1

0

在 XSD 1.0 中,无法<ROOT>根据其定义的属性值来限制模式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 回答