在多个序列之间选择XSD

时间:2018-10-03 21:50:01

标签: xml xsd xsd-validation

我有一个具有以下结构的XML文档:

<Values xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="test.xsd">
    <value>
        <styles>
            <style>   
                <one>12</one>
                <two>123</two>
                <three>123</three>
            </style>
            <style>
                <something>123</something>
            </style>
        </styles>
    </value>
</Values>

我需要为其编写一个XSD架构,所以我这样写:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Values">
    <xs:complexType>
        <xs:all>
            <xs:element name="value">
                <xs:complexType>
                    <xs:all>
                        <xs:element name="styles" type="style_props"/>
                    </xs:all>
                </xs:complexType>
            </xs:element>
        </xs:all>
    </xs:complexType>
</xs:element>

<xs:complexType name="style_props">
    <xs:all>
        <xs:element name="style" type="style_elements"/>
    </xs:all>
</xs:complexType>

<xs:complexType name="style_elements">
    <xs:choice minOccurs="1" maxOccurs="1">
        <xs:group ref="first"/>
        <xs:group ref="second"/>
    </xs:choice>
</xs:complexType>

<xs:group name="first">
    <xs:sequence>
        <xs:element name="one" type="xs:integer"/>
        <xs:element name="two" type="xs:integer"/>
        <xs:element name="three" type="xs:integer"/>
    </xs:sequence>
</xs:group>

<xs:group name="second">
    <xs:sequence>
        <xs:element name="something" type="xs:integer"/>
    </xs:sequence>
</xs:group>
</xs:schema>

但是会发生下一个错误:“发现元素'style'开头的内容无效。这时应该没有子元素。”

我该如何解决?

1 个答案:

答案 0 :(得分:1)

您误解了xs:all的功能。如果希望styles元素包含零个或多个style元素,请输入:

<xs:complexType name="style_props">
    <xs:sequence>
        <xs:element name="style" type="style_elements" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>