XSD 一组元素中的一个元素在另一个元素之前?

XSD for one element out of a group of elements preceding another?

父元素的子元素必须有一个元素(来自一组)后跟另一个特定元素。

<xsd:element name="elementContainer">
    <xsd:element name="element1">
    <xsd:element name="element2">
    <xsd:element name="element3">
    <xsd:element name="element4">
    <xsd:element name="element5">
    <xsd:element name="element6">
    <xsd:element name="proceedingElement">
</xsd:element>

我想修改上面的XSD,使得必须有一个元素(1-6) 后跟前一个元素。

我已尝试围绕元素 1 到 6 进行选择,但验证并未选择该选项。

<xsd:element name="elementContainer">
    <xsd:choice minOccurs="1">
        <xsd:element name="element1">
        <xsd:element name="element2">
        <xsd:element name="element3">
        <xsd:element name="element4">
        <xsd:element name="element5">
        <xsd:element name="element6">
    </xsd:choice>
    <xsd:element name="proceedingElement">
</xsd:element>

对于以下两个示例,我希望第一个通过验证,第二个失败。

<elementContainer>
    <element2/>
    <proceedingElement/>
</elementContainer>

<elementContainer>
    <proceedingElement/>
</elementContainer>

如果有帮助的话,甚至可以忽略存在后续元素的事实,因此只需确保六个元素中至少存在一个元素即可。

关于xsd:choice,你的基本想法是正确的,但是你的XSD有很多问题:

  • xsd:element 个元素未闭合。
  • xsd:complexTypexsd:sequence 缺失。

通过更正上述问题并删除默认值 xsd:choice/@minOccurs = 1,此 XSD、

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" > 
  <xsd:element name="elementContainer">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:choice>
          <xsd:element name="element1"/>
          <xsd:element name="element2"/>
          <xsd:element name="element3"/>
          <xsd:element name="element4"/>
          <xsd:element name="element5"/>
          <xsd:element name="element6"/>
        </xsd:choice>
        <xsd:element name="proceedingElement"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

将要求 element1element6 之一,后跟一个 proceedingElement,按要求。

执行此操作的另一种方法(可能适合也可能不适合您的情况)是使用替换组:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" > 
  <xsd:element name="elementContainer">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="abstractElement"/>
        <xsd:element name="proceedingElement"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="abstractElement" abstract="true"/>

  <xsd:element name="element1" substitutionGroup="abstractElement"/>
  <xsd:element name="element2" substitutionGroup="abstractElement"/>
  ... etc...
</xsd:schema>

与 xs:choice 相比的主要优点是更容易将新元素添加到替换组:例如,它可以由第三方完成而无需修改原始架构。