某个元素中的一个元素中的另一个元素的XSD?

时间:2019-06-03 21:54:33

标签: xml xsd xsd-validation xml-validation

父元素的子元素必须具有一个元素(不属于组),后跟另一个特定元素。

<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>

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

2 个答案:

答案 0 :(得分:0)

关于xsd:choice,您有正确的基本概念,但是XSD存在许多问题:

  • xsd:element元素未关闭。
  • xsd:complexTypexsd:sequence丢失。

针对上述问题进行了更正,并删除了该XSD的默认xsd:choice/@minOccurs = 1

<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

答案 1 :(得分:0)

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

<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相比,主要优点是可以更轻松地向替换组中添加新元素:例如,可以由第三方完成而无需修改原始架构。