我试图在多个complexType元素中使用的元素上强制使用唯一值。
例如:
<xs:element name="lmt">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element ref="lf" maxOccurs="unbounded"/>
<xs:element ref="cdl" maxOccurs="unbounded"/>
</xs:choice>
</xs:complexType>
<xs:unique name="uniquePos">
<xs:selector xpath="./*/pos"/>
<xs:field xpath="."/>
</xs:unique>
</xs:element>
<xs:element name="pos">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:pattern value="\d{1}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="lf">
<xs:complexType>
<xs:sequence>
<xs:element ref="pos"/>
... more elements ...
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="cdl">
<xs:complexType>
<xs:sequence>
<xs:element ref="pos"/>
... more elements ...
</xs:sequence>
</xs:complexType>
</xs:element>
如果我有类似的话,我希望失败:
<lmt>
<lf>
<pos>1</pos>
... more elements ...
</lf>
<cdl>
<pos>1</pos>
... more elements ...
</cdl>
</lmt>
但验证
<lmt>
<lf>
<pos>1</pos>
... more elements ...
</lf>
<cdl>
<pos>2</pos>
... more elements ...
</cdl>
</lmt>
目前似乎都有效。我已经为选择器尝试了./*/pos
和.//pos
,但要么导致第一个示例验证失败。
答案 0 :(得分:1)
如果您希望元素A中的每个B都具有C的唯一值,则应在元素A上定义唯一性约束,selector
表达式应从A中选择B,并field
表达式应从B中选择C.
因此,在您的情况下,应该在您尚未向我们展示的容器元素上定义约束,该容器元素具有lf
和cdl
作为其子元素。选择应为.//pos
或./*/pos
,然后字段应为.