我需要你的帮助来在XML模式中定义一个特例: 包含两个元素的序列:'x'和'y'而不是:
<x>
元素在序列中出现0到未绑定时间
<y>
元素在序列中可以出现0到1次
<x>
和<y>
位置可以是任意位置 - 也就是说,可以将未绑定时间设为<x>
元素,然后是单个<y>
元素,然后取消绑定<x>
元素。
此问题的XML示例:
<x>stuff</x>
<y>stuff</y>
<x>stuff</x>
<y>stuff</y>
<x>stuff</x>
<x>stuff</x>
<x>stuff</x>
<x>stuff</x>
<y>stuff</y>
<x>stuff</x>
谢谢!
答案 0 :(得分:5)
出于各种原因,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>
答案 1 :(得分:2)
我认为你想要的不是一个序列。序列不仅定义了元素,还定义了顺序。在您的情况下,订单可能会改变。你试过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>
另一个appraoch可能是使序列成为序列,但将序列标记为maxOccurs="unbounded"
答案 2 :(得分:0)
不太复杂。在我的头顶,它应该是这样的:
<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
答案 3 :(得分:0)
我使用架构已经有一段时间了,但我认为序列是你的答案。
你需要在(x)或(a 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>