假设我有两组 XML 元素:
<One/>
<Two/>
<Three/>
还有
<A/>
<B/>
<C/>
我想让它们作为存储桶元素的子元素:
<Bucket>
<A/>
<One/>
</Bucket>
或者
<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>
最佳答案
我会选择类似的东西,
<xs:element name="Bucket">
<xs:complexType>
<xs:sequence>
<xs:choice>
<xs:element name="A"/>
<xs:element name="B"/>
<xs:element name="C"/>
</xs:choice>
<xs:choice>
<xs:element name="One"/>
<xs:element name="Two"/>
<xs:element name="Three"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
但可能会定义更好的类型来表示选择,而不是像那样让它们内联。但总体思路是一样的。
默认情况下,minOccurs
和maxOccurs
设置为1
,因此默认情况下不允许每种类型存在多个。这也意味着它们不是可选的。如果您希望任一组都是可选的,则应添加 minOccurs='0'
到<xs:choice>
元素。
关于XML 架构 (XSD) : How to express "At most one element from group A and at most one element from group b"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1883500/