我需要一个XSD,其中必须包含2个元素或1个其他元素的组合

时间:2018-07-13 09:48:13

标签: xsd

我有一个提供参考号的XML。它应该具有HeaderNumber和LineNumber或ExternalReference。同时(全部三个元素)都被允许。 我可以通过组和选择来使第一部分正确,但是如何允许(而不是强迫)所有元素都出现?

我有这个XSD来强制所有元素出现:

<xs:schema>
  <xs:group name="InternalReference">
    <xs:all>
      <xs:element name="HeaderNumber" type="xs:int"/>
      <xs:element name="LineNumber" type="xs:int"/>
    </xs:all>
  </xs:group>
  <xs:group name="Reference">
    <xs:all>
      <xs:group ref="InternalReference"/>
      <xs:element name="ExternalReference"/>
    </xs:all>
  </xs:group>
  <xs:complexType name="message">
    <xs:all>
      <xs:group ref="Reference" minOccurs="1"/>
    </xs:all>
  </xs:complexType>
  <xs:element name="Message" type="message"/>
</xs:schema>

和该XSD包含以下任何一个引用:

<xs:schema>
  <xs:group name="InternalReference">
    <xs:sequence>
      <xs:element name="HeaderNumber" type="xs:int"/>
      <xs:element name="LineNumber" type="xs:int"/>
    </xs:sequence>
  </xs:group>
  <xs:group name="Reference">
    <xs:choice>
      <xs:group ref="InternalReference"/>
      <xs:element name="ExternalReference"/>
    </xs:choice>
  </xs:group>
  <xs:complexType name="message">
    <xs:sequence>
      <xs:group ref="Reference" minOccurs="1"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="Message" type="message"/>
</xs:schema>

非常感谢您提供帮助。

1 个答案:

答案 0 :(得分:0)

我有一个解决方法。这不是最佳解决方案,但非常可行。

<xs:schema>
  <xs:element name="ExternalReference" type="xs:string"/>
  <xs:group name="InternalReference">
    <xs:sequence>
      <xs:element name="HeaderNumber" type="xs:int"/>
      <xs:element name="LineNumber" type="xs:int"/>
      <xs:element ref="ExternalReference" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
  </xs:group>
  <xs:group name="External">
    <xs:sequence>
      <xs:element ref="ExternalReference" minOccurs="1" maxOccurs="1"/>
    </xs:sequence>
  </xs:group>
  <xs:group name="Reference">
    <xs:choice>
      <xs:group ref="InternalReference"/>
      <xs:group ref="External"/>
    </xs:choice>
  </xs:group>
  <xs:complexType name="message">
    <xs:sequence>
      <xs:group ref="Reference" minOccurs="1"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="Message" type="message"/>
</xs:schema>

我仍然希望有更好的方法。