XSD - 在xs:choice中创建一个元素

时间:2013-11-12 02:49:59

标签: xml xsd

我正在开发一个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并未强制执行元素&#34; c2&#34;恰好出现一次。元素&#34; c2&#34;可以完全不存在或者可以出现多次,并且XML仍然被认为是有效的。

我真的有办法允许:

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

2 个答案:

答案 0 :(得分:1)

xs:sequencexs:choice都不适合这项工作。您想要xs:all - 这允许您指定可以按任何顺序出现的元素列表。在XSD 1.0中,每个元素可以显示为零或一次,具体取决于minOccurs;在XSD 1.1中,您还可以指定maxOccurs以允许多个外观。

答案 1 :(得分:1)

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

你需要一个简单的常规语言而不是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>

this answer to a related SO question中描述了问题的更一般形式(带有两个必需元素)。随着所需元素数量的增加,内容模型经历组合爆炸;在这些情况下,XSD 1.1的所有组都更方便。