这是我的问题。在一个节点中,我希望拥有一个属性或一个子节点(来自一个组)。例如:
<set_variable name="bob" value="3/>
或
<set_variable name="bob">
<.../>
</set_variable>
我发现这样做的唯一方法是:
<xs:element name="set_variable" type="setVariableType"/>
<xs:complexType name="setVariableType">
<xs:sequence minOccurs="0" maxOccurs="1">
<xs:group ref="arithmeticGroup"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="value" type="xs:integer" use="optional"/>
</xs:complexType>
<xs:group name="arithmeticGroup">
....
</xs:group>
该解决方案的问题在于它允许两种禁止的方式:
<set_variable name="bob"/> <!-- Should at least have an attribute or a subnode -->
和
<set_variable name="bob" value="18"> <!-- Should not have both attribute and a subnode -->
<.../>
</set_variable>
有人有想法吗?
答案 0 :(得分:2)
不幸的是,XSD 1.0无法做到这一点;您要么必须在XSD 1.0之上使用Schematron断言,要么依赖XSD 1.1 assertions或type alternatives(仅在4月5日伪造为W3C rec)和兼容处理器(没有免费,很少可用)。