无序xsd:所有元素后跟另一个元素

时间:2015-06-22 22:13:43

标签: xml xsd xml-validation

如何为以下XML编写XSD?

<A></A>
<B></B>
<C></C>
<D></D>
<E></E>
<E></E>

A,B,C,D 只有零或一个。他们没有序列。它可以是 D,C,B,A 。最后,有一个或多个E 元素。

我尝试了多种方法,但无法完成。

1 个答案:

答案 0 :(得分:0)

您被XML Schema的非正交性所阻止。您认为以下内容应该有效:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="top">
    <xs:complexType>
      <xs:sequence>
        <xs:all>
          <xs:element name="A" minOccurs="0"/>
          <xs:element name="B" minOccurs="0"/>
          <xs:element name="C" minOccurs="0"/>
          <xs:element name="D" minOccurs="0"/>
        </xs:all>
        <xs:element name="E" minOccurs="1" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

然而,它没有。 XSD的xs:all结构是二等公民;它不能出现在xs:sequence

推荐:根据您的要求删除“任何订单”限额:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="top">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="A" minOccurs="0"/>
        <xs:element name="B" minOccurs="0"/>
        <xs:element name="C" minOccurs="0"/>
        <xs:element name="D" minOccurs="0"/>
        <xs:element name="E" minOccurs="1" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

允许任何元素顺序最终在实践中不如理论重要,特别是考虑到非正交性,如上述情况以及与Unique Particle Attribution发生冲突的可能性。