父元素的子元素必须具有一个元素(不属于组),后跟另一个特定元素。
<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>
如果有帮助,甚至可以忽略存在一个进行中元素的事实,因此只需确保六个元素中至少有一个存在即可。
答案 0 :(得分:0)
关于xsd:choice
,您有正确的基本概念,但是XSD存在许多问题:
xsd:element
元素未关闭。xsd:complexType
和xsd: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>
将要求根据要求提供element1
至element6
中的一个,然后是一个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相比,主要优点是可以更轻松地向替换组中添加新元素:例如,可以由第三方完成而无需修改原始架构。