0

我正在研究不应该强制执行元素顺序的 XSD 模式。换句话说,元素可以以任何顺序出现。有些元素是可选的,有些是必需的。据我所知, xs:sequence 适合这种情况,但由于 xs:sequence 强制执行元素顺序,所以我只剩下 xs:choice ,这在强制执行时非常轻松。例如,考虑一个例子:

<p>
      <c1>can appear 0 to infinite # of times</c1>
      <c2>must appear exactly once</c2>
      <c1>here the optional element appears again</c1>
</p>

我的 XSD 看起来像这样:

<xs:element name="p">
            <xs:complexType>
                         <xs:choice maxOccurs="unbounded">
                                <xs:element name="c1" minOccurs="0" maxOccurs="unbounded" />
                                <xs:element name="c2" minOccurs="1" maxOccurs="1" />
                         </xs:choice>
            </xs:complexType>

但是,上面的 XSD 并不强制元素“c2”只出现一次。元素“c2”可以完全不存在或出现多次,并且 XML 仍然被认为是有效的。

我真的有什么办法可以允许:

  • 任何顺序的元素和
  • 在 xs:choice 中混合可选和必需元素?
4

2 回答 2

1

讨论这个主题的几个地方之一是这个 StackOverflow 问题

你需要一个简单的常规语言而不是 c1 和 c2。您可能编写的自动机有两种状态:初始状态,其中输入中没有遇到 c2,并且接受 c1 和 c2,以及第二状态,其中 c2 已经看到,并且只有 c1公认。这种语言可以用正则表达式(c1*c2c1*)或内容模型来描述。

<xs:sequence>
  <xs:element ref="c1" minOccurs="0" maxOccurs="unbounded"/>
  <xs:element ref="c2"/>
  <xs:element ref="c1" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>

这个对相关 SO question 的回答中描述了更一般的问题形式(具有两个必需的元素)。随着所需元素数量的增加,内容模型会经历组合爆炸;在这些情况下,XSD 1.1 的所有组都方便得多。

于 2013-11-12T17:23:26.190 回答
1

既不xs:sequence也不xs:choice适合这份工作。您想要xs:all- 这允许您指定可以以任何顺序出现的元素列表。在 XSD 1.0 中,每个元素可以出现 0 次或 1 次,具体取决于minOccurs; 在 XSD 1.1 中,您还可以指定 maxOccurs 以允许多次出现。

于 2013-11-12T09:05:44.933 回答