我想验证2种XML“过滤器”块,它们的“形状”包含2个值之一:“空”或“圆”:
- 如果为“空”,则块应仅包含“形状”。
- 如果需要“圆形”,“中心”和“直径”。
XML示例:
<filter>
<shape>empty</shape>
</filter>
<filter>
<shape>circle</shape>
<center>10.3</center>
<diameter>5.1</diameter>
<filter>
我已经尝试过这种XSD架构:
<xs:element name="filter">
<xs:complexType>
<xs:choice>
<xs:all>
<xs:element name="shape" type="xs:string" fixed="circle"/>
<xs:element name="center" type="xs:decimal"/>
<xs:element name="diameter" type="xs:decimal"/>
</xs:all>
<xs:element name="shape" type="xs:string" fixed="empty"/>
</xs:choice>
</xs:complexType>
</xs:element>
未成功... xmllint抱怨:
mytest.xsd:160:全部元素:模式解析器错误:元素'{http://www.w3.org/2001/XMLSchema}选择':内容无效。期望是(注释?,(元素|组|选择|序列|任何)*)。
WXS模式mytest.xsd编译失败
如果我用xs:sequence替换xs:all,它说:
mytest:158:元素complexType:模式解析器错误:本地复杂类型:内容模型不确定。
WXS模式mytest.xsd编译失败
如何编写此XSD-如果可能的话?
我知道,如果我的XML使用的是“ shape0”而不是“ empty”的“ shape”:
<filter>
<shape0>empty</shape0>
</filter>
<filter>
<shape>circle</shape>
<center>10.3</center>
<diameter>5.1</diameter>
<filter>
它可以通过以下方式验证:
<xs:element name="filter">
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element name="shape" type="xs:string" fixed="circle"/>
<xs:element name="center" type="xs:decimal"/>
<xs:element name="diameter" type="xs:decimal"/>
</xs:sequence>
<xs:element name="shape0" type="xs:string" fixed="empty"/>
</xs:choice>
</xs:complexType>
</xs:element>
但是,不幸的是,我的XML使用相同的关键字...