XML模式,结合了;选择“;及;“全部”;

XML模式,结合了;选择“;及;“全部”;,xml,xsd,Xml,Xsd,我正在尝试编写一个XSD来验证XML,其中必须满足以下条件: 元素(父元素)包括: “Choice1”或“Choice2”元素 加上任何或全部“字段1”、“字段2”、“字段2”(等) 以上字段可以按任意顺序显示 因此,例如,有效的XML应该是: <Parent> <Choice1>xxx</Choice1> <Field1>yyy</Field1> <Field2>yyy</Field2> <

我正在尝试编写一个XSD来验证XML,其中必须满足以下条件:

元素(父元素)包括:

  • “Choice1”或“Choice2”元素
  • 加上任何或全部“字段1”、“字段2”、“字段2”(等)
  • 以上字段可以按任意顺序显示
因此,例如,有效的XML应该是:

<Parent>
  <Choice1>xxx</Choice1>
  <Field1>yyy</Field1>
  <Field2>yyy</Field2>
</Parent>
<Parent>
  <Field3>yyy</Field3>
  <Field2>yyy</Field2>
</Parent>

xxx
yyy
yyy
如:

<Parent>
  <Field3>yyy</Field3>
  <Choice2>xxx</Choice2>
  <Field2>yyy</Field2>
</Parent>

yyy
xxx
yyy
无效的将是:

<Parent>
  <Choice1>xxx</Choice1>
  <Field1>yyy</Field1>
  <Field2>yyy</Field2>
</Parent>
<Parent>
  <Field3>yyy</Field3>
  <Field2>yyy</Field2>
</Parent>

yyy
yyy
我似乎无法按照我的意愿嵌套xs:choice和xs:all。

是的,
不能直接插入
。 但使用替换组可以实现相同的效果:

<xs:element name="Parent">
  <xs:complexType>
    <xs:all>
      <xs:element ref="Choice" minOccurs="1"/>

      <xs:element name="Field1" type="xs:string"/>
      <xs:element name="Field2" type="xs:string"/>
    </xs:all>
  </xs:complexType>
</xs:element>

<xs:element name="Choice" abstract="true"/>
<xs:element name="Choice1" substitutionGroup="Choice"> ... </xs:element>
<xs:element name="Choice2" substitutionGroup="Choice"> ... </xs:element>

... 
... 

您需要将
minOccurs=“0”
添加到Field1、Field2定义中,以获得OP想要的内容(我认为-“Field1、Field2等的任何或全部”…我假设“无”也有效。。。但在其他方面做得很好。@ColdFusion太棒了!正是我需要的。非常感谢。@dcsohl您是对的,但我缺少的只是关于替换组的知识,我当前的模式具有适当的minOccurs等。