【发布时间】:2012-01-03 17:09:57
【问题描述】:
这让我发疯了好几个小时。我已经阅读了关于 SO 和 Internet 其他部分的所有相关 XSD 问题,但似乎仍然没有答案。
我需要一个 XML 模式,它要求至少存在一个元素列表,但每个元素可能只出现 0 或 1 次。
这类似于这个问题: XML schema construct for "any one or more of these elements but must be at least one"
但我无法限制上限:我显然错误地使用了maxOccurs。
这里是我的架构中断的地方:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:complexType name="Selects">
<xs:sequence minOccurs="2" maxOccurs="4">
<xs:choice>
<xs:element name="aaa" minOccurs="1" maxOccurs="1"/>
<xs:element name="bbb" minOccurs="1" maxOccurs="1"/>
<xs:element name="ccc" minOccurs="1" maxOccurs="1"/>
<xs:element name="ddd" minOccurs="1" maxOccurs="1"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:element name="baseElement">
<xs:complexType>
<xs:sequence>
<xs:element name="MyChoice" type="Selects"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
我在选择和元素上尝试了minOccurs 和maxOccurs,但没有成功。这是验证的 XML,但我不希望它:
<?xml version="1.0" encoding="UTF-8"?>
<baseElement xsi:noNamespaceSchemaLocation="myTest.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MyChoice>
<ddd/>
<ddd/>
</MyChoice>
</baseElement>
如果可能的话,这是我想要的示例:
<?xml version="1.0" encoding="UTF-8"?>
<baseElement xsi:noNamespaceSchemaLocation="myTest.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MyChoice>
<ddd/>
<aaa/>
<ccc/>
</MyChoice>
</baseElement>
我希望它抱怨多个 ddd 元素,但允许任何或所有其他元素以任何顺序排列。如果我在 MyChoice 下只有一个元素,我会收到一个错误,所以至少有些东西可以工作。
我做错了什么?如何防止多个相同元素验证?
更新
这是我的解决方案(来自 cmets 的回答如下):
实际上,xs:all 成功了。我交换了所有的选择并将 minOccurs="0" maxOccurs="1" 添加到每个元素。对于 xs:all,minOccurs 必须为 0 或 1,maxOccurs 必须为 1。感谢您的帮助 - 我现在可以开始了!
【问题讨论】:
标签: xsd xml-validation