“选择”和“全部”组合的 XML 模式

问题描述 投票:0回答:2

我正在尝试编写一个 XSD 来验证 XML,其中以下内容必须为真:

一个元素(父元素)包括:

  • “Choice1”或“Choice2”元素
  • 加上“Field1”、“Field2”、“Field2”(等)中的任何一个或全部
  • 以上字段可以任意顺序出现

因此,例如,有效的 XML 为:

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

就像这样:

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

无效的是:

<Parent>
  <Field3>yyy</Field3>
  <Field2>yyy</Field2>
</Parent>

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

xml xsd
2个回答
2
投票

是的,

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

0
投票

使用

extension

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">

    <xs:complexType name="MUSTHAVEFIELD">
        <xs:sequence>
            <xs:element name="Field1"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="PARENTTYPE">
        <xs:complexContent>
            <xs:extension base="MUSTHAVEFIELD">
                <xs:choice>
                    <xs:element name="Choice1"/>
                    <xs:element name="Choice2"/>
                </xs:choice>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:element name="Parent" type="PARENTTYPE"/>

</xs:schema>
© www.soinside.com 2019 - 2024. All rights reserved.