【问题标题】:XML schema can have multiple choices in a single complexType?XML 模式在单个 complexType 中可以有多种选择?
【发布时间】:2011-09-29 23:58:12
【问题描述】:

是否可以在 XML 模式中执行类似的操作?

<xsd:complexType name="ItemsType">
  <xsd:choice minOccurs="0" maxOccurs="unbounded">
    <xsd:element ref="shirt"/>
    <xsd:element ref="hat"/>
    <xsd:element ref="umbrella"/>
  </xsd:choice>
  <xsd:choice minOccurs="1" maxOccurs="3">
    <xsd:element ref="apple"/>
    <xsd:element ref="banana"/>
    <xsd:element ref="strawberry"/>
  </xsd:choice>
</xsd:complexType>

这显然是无效的。我想要的是有可能有0个或更多的第一选择..例如可能有衬衫元素和帽子元素,或者可能根本没有衣服元素(因为 minOccurs="0"),然后是至少 1 个水果元素(我想做它,所以必须至少有一个,因为minOccurs="1")。

有什么办法吗?

感谢您的帮助。

【问题讨论】:

  • 对我来说看起来有效;您是否简化了示例并错误地隐藏了问题?如果第二个选项包含一个也出现在第一个选项中的元素,这将变得无效......

标签: java xml xsd schema


【解决方案1】:

&lt;xsd:complexType&gt; 期望只有一个子元素。将您的两个选择包含在一个 &lt;xsd:sequence&gt; 中。

例子

<xsd:complexType name="ItemsType">
  <xsd:sequence>
    <xsd:choice minOccurs="0" maxOccurs="unbounded">
      ... clothes ...
    </xsd:choice>
    <xsd:choice minOccurs="1" maxOccurs="3">
      ... fruits ...
    </xsd:choice>
  </xsd:sequence>
</xsd:complexType>

【讨论】:

  • @jasso 但这需要在 xml 中的水果选择之前指定衣服选择,对吗?有没有办法不需要订购?
  • @DavidDoria 我想到的第一个解决方案是创建一个仅交换内容顺序的序列的副本,然后将这两个序列包装在一个选择元素中。通常在这种情况下,您可能应该使用组来简化代码。同样在这种情况下,您应该注意不要使结构不确定,因为衣服选择是可选的。这可以通过强制衣服选择来解决,如果它们首先出现并且在水果首先出现的交换序列中是可选的。
猜你喜欢
  • 1970-01-01
  • 2011-11-28
  • 2011-01-30
  • 1970-01-01
  • 2019-03-03
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多