【问题标题】:XSD for one element out of a group of elements preceding another?一组元素中的一个元素在另一个元素之前的 XSD?
【发布时间】:2019-06-03 21:54:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: xml xsd xsd-validation xml-validation


    【解决方案1】:

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

    • xsd:element 元素未关闭。
    • xsd:complexType 和 xsd: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>
    

    将要求有element1 到element6 之一,后跟一个proceedingElement,根据要求。

    【讨论】:

    • 感谢 kjhughes,这正是我所需要的。
    【解决方案2】:

    另一种可能适合或不适合您的情况的方法是使用替代组:

    <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 相比的主要优势在于更容易将新元素添加到替换组:例如,它可以由第三方完成,而无需修改原始架构。

    【讨论】:

    • 谢谢迈克尔,我以后可能会试试这个。
    猜你喜欢
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2015-06-02
    相关资源
    最近更新 更多