XML 包含 choice 和 all 组合的架构

XML Schema with a combination of choice and all

我想像这样进行验证:

<A>
   <B> or <C>
   <D>
</A>

在 中,第一个元素应该是B和C中的一个,第二个元素是D。同时,第一个元素B或C和第二个元素不在先后顺序。它可以变成和。有人知道怎么做吗?

要匹配您的示例,请尝试:

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

你必须在这里使用两个东西,第一个是 <xs:choice> 它只允许一个元素出现在 xml.

为了使元素可选 (D),您必须指定 minOccurs="0"

已编辑(反馈后): 所有有效案例都包含在此XSD。

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="B" type="xs:string"/>
  <xs:element name="C" type="xs:string"/>
  <xs:element name="D" type="xs:string"/>

  <xs:complexType name="OurType">
    <xs:choice>
      <xs:sequence>
        <xs:element ref="D"/>
        <xs:choice>
          <xs:element ref="B"/>
          <xs:element ref="C"/>
        </xs:choice>
      </xs:sequence>
      <xs:sequence>
        <xs:choice>
          <xs:element ref="B"/>
          <xs:element ref="C"/>
        </xs:choice>
        <xs:element ref="D"/>
      </xs:sequence>
    </xs:choice>
  </xs:complexType>

  <xs:element name="A" type="OurType"/>

</xs:schema>

我得到了最佳实践。它应该如下所示:

<xs:element name="A">
   <xs:complexType>
      <xs:all>
        <xs:element ref="Choice" minOccurs="1" maxOccurs="1"/>
        <xs:element ref="D" minOccurs="0" maxOccurs="1"/>
      </xs:all>
   </xs:complexType>
 </xs:element>

 <xs:element name="D" type="xs:string"/>

 <xs:element name="Choice" abstract="true"/> 

 <xs:element name="B" substitutionGroup="Choice"> 
 </xs:element>

 <xs:element name="C" substitutionGroup="Choice"> 
 </xs:element>