如何编写XSD实现可选列表存在时至少包含1个元素的校验规则
修正方案
你当前的XSD未限制<special>节点的最大出现次数,同时冗余配置导致空<specials>节点无法被识别为非法,调整如下即可满足要求:
修正后完整XSD代码
<xs:element name="software"> <xs:complexType> <xs:sequence> <xs:element name="programm" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="name" type="xs:string" minOccurs="1"/> <xs:element name="specials" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="special" type="xs:string" minOccurs="1" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="id" type="programmID"/> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element>
调整说明
- 移除了
<xs:sequence>上冗余的minOccurs="1"配置(该属性默认值就是1,无需显式声明) - 给
<special>节点新增maxOccurs="unbounded"配置,既可以强制只要出现<specials>就至少有1个<special>子节点,也能匹配你示例中多个<special>的使用场景 - 调整后空
<specials></specials>或自闭合<specials/>都会触发校验错误,完全符合你要求的规则
内容的提问来源于stack exchange,提问作者Ulf Tietze
相关产品推荐
相关产品推荐

