假设我有两组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 Schema中表达这一点?
我想尝试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>
答案 0 :(得分:3)
我会选择类似的东西,
<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>
元素。