结合了选择和所有

时间:2015-08-19 19:47:57

标签: xsd

我想进行以下验证:

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

在第一个元素应该是B和C之一。第二个元素是D.同时,第一个元素B或C和第二个元素不是顺序的。它可能成为和。有谁知道怎么做?

2 个答案:

答案 0 :(得分:1)

我得到了最好的练习。它应该如下:

<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>

答案 1 :(得分:0)

为了符合您的示例,请尝试:

<?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>