XML Schema (XSD):如何表达“A 组中最多有一个元素,b 组中最多有一个元素”?

发布于 2024-08-14 11:25:36 字数 1335 浏览 3 评论 0原文

假设我有两组 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

霓裳挽歌倾城醉 2024-08-21 11:25:36

我会选择类似的东西,

<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' 添加到 元素。

I'd go with something like,

<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>

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 and maxOccurs are set to 1, 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 add minOccurs='0' to the <xs:choice> element.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文