4

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

今天我有这个:

<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

我的替代方案是什么?

4

2 回答 2

5

您可以使用<xsd:choice minOccurs="0" maxOccurs="unbounded">代替您xsd:sequence的来模拟无序元素验证。这绕过了xsd:all.

于 2013-01-16T15:25:44.343 回答
1

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

  • 序列,这需要特定的排序
  • 所有,这没有。

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

另外两种方法值得一提:

  • 在 XSD 1.1 中,对所有组中的 maxOccurs 的约束已被取消(尽管不是对所有组的其他约束)。
  • 由于您想要的语言显然是一种常规语言,因此您可以使用嵌套的选择和序列为其编写内容模型。XSD 的“唯一粒子属性”约束使这有点乏味,这意味着您必须避免任何可能使内容模型不确定的事情,但这是可行的。另一个问题的答案中显示了一个具体的例子。
于 2013-01-16T16:14:24.730 回答