IT干货网

XSD 里面的所有选择

itxm 2024年11月01日 编程设计 4 0

您不能将选择标签放在所有标签中。那么,是否有任何解决方法来获得此功能?
例如,我有 <settings>标签如:

<settings> 
    <logging /> 
    <sending /> 
    <useonly /> 
</settings> 

或者类似的东西
<settings> 
    <logging /> 
    <notuseonly /> 
    <sending /> 
</settings> 

所以我想阻止 <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> 

有什么想法吗?

请您参考如下方法:

检查此链接: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> 

另一种是使用替换组:
  <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> 


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!