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: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
,按要求。
执行此操作的另一种方法(可能适合也可能不适合您的情况)是使用替换组:
<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 相比的主要优点是更容易将新元素添加到替换组:例如,它可以由第三方完成而无需修改原始架构。
父元素的子元素必须有一个元素(来自一组)后跟另一个特定元素。
<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: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
,按要求。
执行此操作的另一种方法(可能适合也可能不适合您的情况)是使用替换组:
<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 相比的主要优点是更容易将新元素添加到替换组:例如,它可以由第三方完成而无需修改原始架构。