【问题标题】:XML Schema (XSD): How to express "At most one element from group A and at most one element from group b"?XML Schema (XSD):如何表达“A 组中最多一个元素,B 组中最多一个元素”?
【发布时间】:2010-12-25 09:44:18
【问题描述】:

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

【问题讨论】:

  • 您不允许任何人加入群组吗?比如,&lt;Bucket&gt;&lt;A/&gt;&lt;/Bucket&gt; 可以接受吗?
  • 是的。这是可以接受的以及&lt;Bucket&gt;&lt;One/&gt;&lt;/Bucket&gt;
  • 好问题.. +1,也很喜欢

标签: xml xpath xsd schema unique


【解决方案1】:

我会选择类似的东西,

<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' 添加到 &lt;xs:choice&gt; 元素。

【讨论】:

  • 嗯...这似乎无效。一个xs:choice 是允许的,但两个(没有容器)是不允许的。我也尝试了嵌套选项,但在我的编辑器(vs2010)中似乎都无效。
  • 是的......我想我让它变得比以前更难了。感谢您的建议。
  • @ee:我为你折腾了序列。对此感到抱歉,但当时我太忙了,无法自己测试代码。感谢您的提醒。
猜你喜欢
  • 1970-01-01
  • 2019-07-29
  • 2012-02-18
  • 2017-03-23
  • 1970-01-01
  • 2011-01-30
  • 2021-11-22
  • 1970-01-01
  • 2011-12-19
相关资源
最近更新 更多