XML 架构 (XSD) : How to express "At most one element from group A and at most one element from group b"?

标签 xml xpath xsd schema unique

假设我有两组 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>

但可能会定义更好的类型来表示选择,而不是像那样让它们内联。但总体思路是一样的。

默认情况下,minOccursmaxOccurs设置为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/

相关文章:

c# - 如何通过非null属性和ID查找元素?

xml - 如何选择包含@符号(at符号)的属性

java - 添加指向 REST 响应的链接

android - 如何更改 Android Studio 中的默认模板布局文件

java - 重复图层列表中的颜色背景

c# - 使用 C# 反序列化 XML HTTP 响应

c# - 在 C# 中从分层数据集创建 XML

parsing - HTML Agility Pack xPath问题

java - 无法在 Maven 环境中从 JAXB 生成类

java - 如何通过 xsd 验证 org.w3.dom.Document?