在xsd:all中有xsd:sequence行为的替代方法是什么?

时间:2013-01-16 15:11:56

标签: xml xsd xsd-validation

我不明白我应该如何定义我的复杂类型。

今天我有这个:

<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 xsd:all >

我的替代方案是什么?

2 个答案:

答案 0 :(得分:4)

您可以使用<xsd:choice minOccurs="0" maxOccurs="unbounded">代替xsd:sequence来模拟非有序元素验证。这避免了xsd:all的限制。

答案 1 :(得分:1)

在XSD 1.0中,您已经确定了它们的替代方案(如果您想保持简单):

  • 序列,需要特定的排序
  • 全部,但没有。

如果排序没有意义(因此序列文档id,文件名,作者和序列作者,document-id,filename携带相同的信息),那么在修复序列时不会丧失表达能力。或者您可以使用predi建议的无限选择,并将部分验证逻辑(检查基数)放在应用程序的另一层中。我认为最高度的词汇设计师通常会在这种情况下推荐一个序列。

另外两种方法值得一提:

  • 在XSD 1.1中,所有组中对maxOccurs的约束已被解除(尽管不是所有组的其他约束)。
  • 由于您想要的语言显然是常规语言,因此您可以使用嵌套选项和序列为其编写内容模型。 XSD的“独特的粒子归因”约束使得这有点单调乏味,这意味着你必须避免任何可能使内容模型不确定的东西,但它是可行的。 the answer to another question
  • 中显示了一个具体示例