我不明白我应该如何定义我的复杂类型。
今天我有这个:
<xsd:element name="batch_requests_callbacks">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="document_id" minOccurs="1" maxOccurs="1"/>
<xsd:choice minOccurs="0" maxOccurs="1">
<xsd:element ref="filename"/>
<xsd:element ref="error"/>
</xsd:choice>
<xsd:element ref="author" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="version" default="1.0"/>
</xsd:complexType>
</xsd:element>
但是,xsd:sequence
中的标签顺序很重要,我不希望这种行为。
如果我使用xsd:all
我没有标记顺序,但我无法将maxOccurs
设置为无限制,我无法在xsd:choice
我的替代方案是什么?
答案 0 :(得分:4)
您可以使用<xsd:choice minOccurs="0" maxOccurs="unbounded">
代替xsd:sequence
来模拟非有序元素验证。这避免了xsd:all
的限制。
答案 1 :(得分:1)
在XSD 1.0中,您已经确定了它们的替代方案(如果您想保持简单):
如果排序没有意义(因此序列文档id,文件名,作者和序列作者,document-id,filename携带相同的信息),那么在修复序列时不会丧失表达能力。或者您可以使用predi建议的无限选择,并将部分验证逻辑(检查基数)放在应用程序的另一层中。我认为最高度的词汇设计师通常会在这种情况下推荐一个序列。
另外两种方法值得一提: