我已经尝试了所有 <xs:all>, <xs:choice>, and <xs:sequence>
这些都不能令人满意地帮助我的案例。
有谁知道你会如何验证这样的事情。
<Menu>
<SubMenu>
<MenuItem .. />
<MenuItem .. />
<MenuItem .. />
</SubMenu>
<MenuItem .. >
<MenuItem .. >
</Menu>
在哪里,
下<Menu>
标签
<SubMenu>
和/或 <MenuItem>
可以以任何顺序出现任意次数(0-n)。
但至少其中之一必须至少出现一次。
忽略 SubMenu 标签内的验证。
非常感谢在此问题上的任何帮助。
最佳答案
如果我正确理解了您的要求,那么您可以将该模型表述为“其中一个 SubMenu 或 MenuItem 后跟零个或多个 SubMenu 或 MenuItem 元素”。这可以很容易地表示为两个选择的序列:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- whatever your element needs to be modelled as here -->
<xs:element name="MenuItem">
<xs:complexType>
<xs:attribute name="text"/>
</xs:complexType>
</xs:element>
<!-- only modelling the structure of the child elements here -->
<xs:element name="SubMenu">
<xs:complexType>
<xs:sequence>
<xs:choice minOccurs="1" maxOccurs="1">
<xs:element ref="MenuItem"/>
<xs:element ref="SubMenu"/>
</xs:choice>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="MenuItem"/>
<xs:element ref="SubMenu"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Menu">
<xs:complexType>
<xs:sequence>
<xs:choice minOccurs="1" maxOccurs="1">
<xs:element ref="MenuItem"/>
<xs:element ref="SubMenu"/>
</xs:choice>
<xs:choice minOccurs="1" maxOccurs="unbounded">
<xs:element ref="MenuItem"/>
<xs:element ref="SubMenu"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
您可以使用 Menu 和 SubMenu 的共享全局类型更清晰地对此进行建模,但我希望这种方式相对明显。
关于xml - XSD 任意元素任意顺序任意次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3716449/