似乎您实际上需要一个看起来像这样的定义:
<!-- This is an INVALID example -->
<xs:element name="param">
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element name="key" type="xs:string" fixed="age" />
<xs:element name="value" type="xs:decimal" />
</xs:sequence>
<xs:sequence>
<xs:element name="key" type="xs:string" fixed="smart" />
<xs:element name="value" type="xs:boolean" />
</xs:sequence>
</xs:choice>
</xs:complexType>
</xs:element>
不幸的是,这样的代码会导致无效的 XML Schema文件。
尽管语法是正确的,但语义违反了模式规则。具有相同名称和相同作用域的元素必须具有相同的类型。在这种情况下,这尤其意味着作为<value>
元素子元素的所有<param>
元素必须具有相同的类型。
形式上这是Schema Component Constraint: Element Declarations Consistent。另请参阅以下架构组件约束;通常,您不能使元素类型依赖于文档中的某些其他值或有关序列其余部分中的项目的任何信息。
更新
我完全忘记了这一点,但是如果您在实例文档中指定所需的类型而不是纯粹在模式中定义它,您应该能够获得所需的约束。这可以通过将xsi:type
属性添加到<value>
元素来完成。
例子
<param>
<key>age</key>
<value xsi:type="xs:decimal">10</value>
</param>
<param>
<key>smart</key>
<value xsi:type="xs:boolean">true</value>
</param>
当然这有点不方便,因为它需要更改 XML 生成过程。此外,它不会自动提供任何保证<key>
和定义xsi:type
是匹配对。