在XSD中支持两种形式的序列

时间:2017-03-22 08:31:08

标签: xml xsd

我试图为特定元素支持两种不同的结构。

这是我试图允许的例子:

<wrapper>
    <example>
       <a>str</a>
       <b>str</b>
       <cs>
          <c>str</c>
          <c>str</c>
          <c>str</c>
       </cs>
    </example>
    <example>
       <a>str</a>
       <e>str</e>
       <cs>
          <c>str</c>
          <c>str</c>
          <d>str</d>
       </cs>
    </example>
</wrapper>

显然结构不同,虽然它包含一些类似的部分。

规则:

  • 必须出现在两种类型
  • b必须出现在第一种类型上,e必须出现在第二种
  • cs必须出现在两种类型
  • cs可以包含任意数量的c,但我们可以在第二种类型
  • 上添加另一个

我试图编写以下xsd:

        <xs:element name="wrapper">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="example">
                        <xs:complexType>
                            <xs:choice maxOccurs="1" minOccurs="1">
                                <xs:sequence>
                                    <xs:element name="a" maxOccurs="1" minOccurs="1" type="xs:string"/>
                                    <xs:element name="b" maxOccurs="1" minOccurs="1" type="xs:string"/>
                                    <xs:element maxOccurs="1" minOccurs="1" name="cs">
                                        <xs:complexType>
                                            <xs:sequence>
                                                <xs:element name="c" maxOccurs="unbounded" type="xs:string"/>
                                            </xs:sequence>
                                        </xs:complexType>
                                    </xs:element>
                                </xs:sequence>
                                <xs:sequence>
                                    <xs:element name="a" maxOccurs="1" minOccurs="1" type="xs:string"/>
                                    <xs:element name="e" maxOccurs="1" minOccurs="1" type="xs:string"/>
                                    <xs:element maxOccurs="1" minOccurs="1" name="cs">
                                        <xs:complexType>
                                            <xs:sequence>
                                                <xs:element name="c" maxOccurs="unbounded" type="xs:string"/>
                                                <xs:element name="d" maxOccurs="1" type="xs:string"/>
                                            </xs:sequence>
                                        </xs:complexType>
                                    </xs:element>
                                </xs:sequence>
                            </xs:choice>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
            </xs:complexType>
        </xs:element>

但是,当我使用它进行验证时,结果是一个例外:

  

org.xml.sax.SAXParseException:类型&#39;#AnonType_example&#39;出错。   名称为“cs&#39;”且具有不同类型的多个元素出现在   模特组。

实施此类验证的最佳方法是什么?我正在尝试提取组下的每个序列并引用它但结果是相同的。

修改 试图采取共同措施,但仍然抱怨cs:

<xs:element name="wrapper">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="example">
                    <xs:complexType>
                            <xs:sequence>
                                <xs:element name="a" maxOccurs="1" minOccurs="1" type="xs:string"/>
                                <xs:choice maxOccurs="1" minOccurs="1">
                                    <xs:sequence>
                                        <xs:element name="b" maxOccurs="1" minOccurs="1" type="xs:string"/>
                                        <xs:element maxOccurs="1" minOccurs="1" name="cs">
                                            <xs:complexType>
                                                <xs:sequence>
                                                    <xs:element name="c" maxOccurs="unbounded" type="xs:string"/>
                                                </xs:sequence>
                                            </xs:complexType>
                                        </xs:element>
                                    </xs:sequence>
                                    <xs:sequence>
                                        <xs:element name="e" maxOccurs="1" minOccurs="1" type="xs:string"/>
                                        <xs:element maxOccurs="1" minOccurs="1" name="cs">
                                            <xs:complexType>
                                                <xs:sequence>
                                                    <xs:element name="c" maxOccurs="unbounded" type="xs:string"/>
                                                    <xs:element name="d" maxOccurs="1" type="xs:string"/>
                                                </xs:sequence>
                                            </xs:complexType>
                                        </xs:element>
                                    </xs:sequence>
                                </xs:choice>
                            </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
  

类型&#39;#AnonType_examplewrapper&#39;出错。名称为“cs&#39;”且具有不同类型的多个元素将显示在模型组中。

1 个答案:

答案 0 :(得分:0)

您的内容模型必须明确无误。因此,举例来说,不应在(abc)(aecd)之间进行选择,而应将其重写为以a开头并继续选择的序列,即{{1} }。如果有选择,遇到的第一个元素名称必须使系统能够决定选择哪个分支。

编辑,因为你似乎需要拼写出来:

(a(bc|ecd))