具有任意顺序元素和无限重数的XSD
我需要生成一个XSD。在根元素下,7个不同元素中的任何一个可以出现0、1或多个,并且这些元素可以以任意顺序出现 我不能使用sequence,因为元素不一定按预定义的顺序排列。这是一个有效的模式,但它施加了太严格的限制:具有任意顺序元素和无限重数的XSD,xsd,Xsd,我需要生成一个XSD。在根元素下,7个不同元素中的任何一个可以出现0、1或多个,并且这些元素可以以任意顺序出现 我不能使用sequence,因为元素不一定按预定义的顺序排列。这是一个有效的模式,但它施加了太严格的限制: <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="data"> <xs:complexType> <xs:sequence> 我
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="data">
<xs:complexType>
<xs:sequence>
我不能全部使用,因为它不允许maxOccurs是无界的,所以这是一个无效的架构:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="data">
<xs:complexType>
<xs:all>
<xs:element name="address" minOccurs="0" maxOccurs="unbounded">
我觉得我遇到了XSD的另一个限制,但我只是想问一下,因为我是XML模式的新手。在每个元素上使用带有
maxOccurs=“1”
的选项。这将确保a、b或c中至少有一个,但每个中不超过一个
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="a" maxOccurs="1"/>
<xs:element name="b" maxOccurs="1"/>
<xs:element name="c" maxOccurs="1"/>
</xs:choice>
以下所有内容在此架构下均有效:
<root>
<a/>
</root>
<root>
<a/>
<b/>
</root>
<root>
<b/>
<a/>
</root>
<root>
<c/>
<a/>
</root>
<root>
<a/>
<c/>
<b/>
</root>
在每个元素上使用带有maxOccurs=“1”
的选项
块。这将确保a、b或c中至少有一个,但每个中不超过一个
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element name="a" maxOccurs="1"/>
<xs:element name="b" maxOccurs="1"/>
<xs:element name="c" maxOccurs="1"/>
</xs:choice>
以下所有内容在此架构下均有效:
<root>
<a/>
</root>
<root>
<a/>
<b/>
</root>
<root>
<b/>
<a/>
</root>
<root>
<c/>
<a/>
</root>
<root>
<a/>
<c/>
<b/>
</root>
谢谢克雷格,这很有效。实际上,我使用了minOccurs=0
,因为只提供根元素而不提供其他元素是可以接受的(尽管不常见)。这里有两点值得注意的细节:(1)maxOccurs=“1”是默认值,因此无需显式指定;(2)在可重复的选择中,maxOccurs对有效实例集没有影响:(a | b)+定义与(a+| b+)相同的语言。解决方案的关键点是:使用可重复的选择。为了符合您的要求,选择应该是minOccurs=“0”是的,您是对的。我已经使用了minOccurs=“0”
,但是我已经删除了所有出现的minOccurs=“1”
和maxOccurs=“1”
,并且仍然有效。谢谢Craig,这很有效。实际上,我使用了minOccurs=0
,因为只提供根元素而不提供其他元素是可以接受的(尽管不常见)。这里有两点值得注意的细节:(1)maxOccurs=“1”是默认值,因此无需显式指定;(2)在可重复的选择中,maxOccurs对有效实例集没有影响:(a | b)+定义与(a+| b+)相同的语言。解决方案的关键点是:使用可重复的选择。为了符合您的要求,选择应该是minOccurs=“0”是的,您是对的。我已经使用了minOccurs=“0”
,但是我已经删除了所有出现的minOccurs=“1”
和maxOccurs=“1”
,并且仍然有效。