XSD中各元素的唯一值

时间:2017-08-10 22:01:58

标签: xml xsd xsd-validation xml-validation xsd-1.0

我试图在多个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,但要么导致第一个示例验证失败。

1 个答案:

答案 0 :(得分:1)

如果您希望元素A中的每个B都具有C的唯一值,则应在元素A上定义唯一性约束,selector表达式应从A中选择B,并field表达式应从B中选择C.

因此,在您的情况下,应该在您尚未向我们展示的容器元素上定义约束,该容器元素具有lfcdl作为其子元素。选择应为.//pos./*/pos,然后字段应为.