您不能将选择标记放在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)