题
我需要您的帮助来定义 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 次
不隶属于 StackOverflow