XML Schema (XSD):如何表达“A 组中最多有一个元素,b 组中最多有一个元素”?
假设我有两组 XML 元素:
<One/>
<Two/>
<Three/>
And
<A/>
<B/>
<C/>
并且我希望将它们作为存储桶元素的子元素:
<Bucket>
<A/>
<One/>
</Bucket>
Or
<Bucket>
<C/>
<Two/>
</Bucket>
但我不想允许任一组元素中存在多个元素。即:
<Bucket>
<A/>
<B/>
<One/>
</Bucket>
并且
<Bucket>
<A/>
<One/>
<Two/>
</Bucket>
将无效。我如何在 XML 模式中表达这一点?
我想尝试 xs:unique
但这会阻止 name()
和 local-name()
在字段或选择器中使用。
更新
完整的解决方案是:
<xs:element name="Bucket">
<xs:complexType>
<xs:sequence>
<xs:choice minOccurs="0">
<xs:element name="A"/>
<xs:element name="B"/>
<xs:element name="C"/>
</xs:choice>
<xs:choice minOccurs="0">
<xs:element name="One"/>
<xs:element name="Two"/>
<xs:element name="Three"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
Say I have two sets of XML elements:
<One/>
<Two/>
<Three/>
And
<A/>
<B/>
<C/>
And I want to have them as children of a bucket element:
<Bucket>
<A/>
<One/>
</Bucket>
Or
<Bucket>
<C/>
<Two/>
</Bucket>
But I don't want to allow more than one element from either set of elements. I.e:
<Bucket>
<A/>
<B/>
<One/>
</Bucket>
and
<Bucket>
<A/>
<One/>
<Two/>
</Bucket>
would be invalid. How might I express this in my XML Schema?
I thought to try xs:unique
but that prevents name()
and local-name()
usage in the field or selector.
UPDATE
The full solution is:
<xs:element name="Bucket">
<xs:complexType>
<xs:sequence>
<xs:choice minOccurs="0">
<xs:element name="A"/>
<xs:element name="B"/>
<xs:element name="C"/>
</xs:choice>
<xs:choice minOccurs="0">
<xs:element name="One"/>
<xs:element name="Two"/>
<xs:element name="Three"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我会选择类似的东西,
但可能会定义更好的类型来表示选择,而不是像那样让它们内联。但总体思路是一样的。
默认情况下,
minOccurs
和maxOccurs
设置为1
,因此默认情况下不允许每种类型存在多个。这也意味着它们不是可选的。如果您希望任一组都是可选的,则应将minOccurs='0'
添加到
元素。I'd go with something like,
But probably with better types defined to represent the choices instead of having them inline like that. But the general idea is the same.
By default,
minOccurs
andmaxOccurs
are set to1
, so by default this doesn't permit multiples of each type to be present. It also means they aren't optional. If you want either group to be optional, you should addminOccurs='0'
to the<xs:choice>
element.