结合选择和全部的 XML 模式

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

我想做这样的验证:

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

中,第一个元素应该是B和C中的一个,第二个元素是D。同时,第一个元素B或C与第二个元素不按顺序排列。它可能会变成 和 。有人知道怎么做吗

xsd
3个回答
2
投票

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

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

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

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

0
投票

使用

extension

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

    <xs:complexType name="MUSTHAVEB">
        <xs:sequence>
            <xs:element name="B"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="ATYPE">
        <xs:complexContent>
            <xs:extension base="MUSTHAVEB">
                <xs:choice>
                    <xs:element name="C"/>
                    <xs:element name="D"/>
                </xs:choice>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

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

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