XSD选择在所有内部

Огњ*_*јић 6 xsd

您不能将选择标记放在all标记内.那么,是否有任何解决方法来获得此功能?例如,我有以下<settings>标签:

<settings>
    <logging />
    <sending />
    <useonly />
</settings>
Run Code Online (Sandbox Code Playgroud)

或类似的东西

<settings>
    <logging />
    <notuseonly />
    <sending />
</settings>
Run Code Online (Sandbox Code Playgroud)

所以我想防止<useonly><notuseonly>一起出现,而顺序并不重要.如果允许,在XSD中它看起来像:

  <xs:all>
    <xs:element minOccurs="0" maxOccurs="1" ref="sending" />
    <xs:element minOccurs="0" maxOccurs="1" ref="logging" />
    <xs:choice>
         <xs:element minOccurs="0" maxOccurs="1" ref ="useonly" />
         <xs:element minOccurs="0" maxOccurs="1" ref ="notuseonly" />
     </xs:choice>
  </xs:all>
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

小智 7

请查看以下链接:http://www.w3.org/wiki/Needs_choice_inside_all

我总结了你提出的解决方案:

一种解决方案是将可以在另一个内部更改的元素包装起来:

  <xsd:all>
   <xsd:element minOccurs="0" maxOccurs="1" ref="sending" />
   <xsd:element minOccurs="0" maxOccurs="1" ref="logging"/>
   <xsd:element minOccurs="0" maxOccurs="1" ref ="usetype"/>
  </xsd:all>

 <xsd:element name="usetype">
  <xsd:complexType>
   <xsd:choice>
    <xsd:element ref="useonly"/>
    <xsd:element ref="notuseonly"/>
   </xsd:choice>
  </xsd:complexType>
 </xsd:element>
Run Code Online (Sandbox Code Playgroud)

另一个是使用替换组:

  <xsd:all>
   <xsd:element ref="sending"/>
   <xsd:element ref="logging"/>
   <xsd:element ref="usetype"/>
  </xsd:all>
 </xsd:complexType>
 <xsd:element name="usetype" abstract="true"/>
 <xsd:element name="useonly" substitutionGroup="usetype"> ... </xsd:element>
 <xsd:element name="notuseonly" substitutionGroup="usetype"> ... </xsd:element>
Run Code Online (Sandbox Code Playgroud)

  • 那么substitutionGroup 方法是否正是所需的行为(就像xs:choice 在xs:all 中一样)?如果是这样,他们为什么不直接允许? (2认同)