我需要您的帮助来定义 XML 模式中的特殊情况:包含两个元素的序列:'x' 和 'y' 而:

  • <x> 元素在序列中可以出现 0 到无限次

  • <y> 元素可以在序列中出现 0 到 1 次

  • <x><y> 位置可以是任何地方 - 也就是说,可以有不受限制的时间 <x> 元素,然后是单个 <y> 元素,然后是未绑定的时间 <x> 元素。

此问题的 XML 示例:

例子#1

<x>stuff</x>
<y>stuff</y>
<x>stuff</x>

例子#2

<y>stuff</y>
<x>stuff</x>
<x>stuff</x>

例子#3

<x>stuff</x> 
<x>stuff</x>
<y>stuff</y>
<x>stuff</x>

谢谢!

有帮助吗?

解决方案

由于各种原因,Yuval、Mo 或 davidsheldon 的样本都不起作用。这是一个 确实如此。

    <xs:complexType name="myComplexType">
    <xs:sequence>
        <xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
        <xs:sequence minOccurs="0">
            <xs:element name="y" type="xs:string"/>
            <xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:sequence>
    </xs:complexType>

其他提示

编辑:正如 Alohci 提到的,我的解决方案是不正确的。根据规范,xs:all 中的元素只能出现零次或一次。任何不便敬请谅解

我认为你想要的不是一个序列。序列不仅定义元素,还定义顺序。根据您的情况,顺序可能会改变。你试过xs:all吗?

<xs:complexType name="myComplexType">
  <xs:all>
    <xs:element name="x" type="xs:string" maxOccurs="unbounded"/>
    <xs:element name="y" type="xs:string" maxOccurs="1"/>
  </xs:all>
</xs:complexType>

另一种方法可能是使其成为一个序列,但将序列标记为 maxOccurs="unbounded"

自从我使用模式以来已经有一段时间了,但我认为序列就是你的答案。

您需要在(x)或(y 后跟 x)之间有无限数量的选择。

<xsd:element name="parent">
  <xsd:complexType>
    <xsd:choice maxOccurs="unbounded">
      <xsd:element name="x" type="xs:string"/>
      <xsd:sequence>
        <xsd:element name="y" type="xsd:string" />
        <xsd:element name="x" type="xsd:string" />
      </xsd:sequence>
    </xsd:choice>
  </xsd:complexType>  
</xsd:element>  

不太复杂。在我的脑海中,它应该是这样的:

<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="y" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> 

由于 XSD 中的每个元素默认都是可选的,因此该 XSD 将与您定义的 XML 结构相匹配,其中 y 元素出现在之前、之后或之间的任何位置 x 元素,最多出现 1 次

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top