这是一个XML模式,用于定义包含params
和atomicParam
元素的complexParam
根元素的文档。这两种类型的元素都有name
属性。
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://companyname.org/"
xmlns:tns="http://companyname.org/"
>
<element name="params" type="tns:ParamsType"/>
<complexType name="ParamsType">
<sequence>
<element name="atomicParam" type="tns:AtomicParamType" minOccurs="0" maxOccurs="unbounded"/>
<element name="complexParam" type="tns:ComplexParamType" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
<complexType name="ComplexParamType">
<simpleContent>
<extension base="string">
<attribute name="name" type="string" use="required"/>
</extension>
</simpleContent>
</complexType>
<complexType name="AtomicParamType">
<simpleContent>
<extension base="string">
<attribute name="name" type="string" use="required"/>
</extension>
</simpleContent>
</complexType>
</schema>
我的目标是将以下约束应用于name
属性:
atomicParam
具有该属性的某个值(例如foo
),则complexParam
元素中的任何一个都不应具有此属性的相同值。同时,atomicParam
属性中的另一个foo
可能有name
。complexParam
具有该属性的某个值(例如bar
),则atomicParam
元素中的任何一个都不应具有此属性的相同值。同时,complexParam
属性中的另一个bar
可能有name
。这可能吗?
答案 0 :(得分:0)
使用XSD 1.0是不可能的:有一种方法可以强制执行值的唯一性,但不能按照此处所需的方式强制执行不同的元素。
应该可以在XSD 1.1中使用断言:
<xsd:assert test="not(atomicParam/@name=complexParam/@name)"/>