【问题标题】:Unique value across elements in XSDXSD 中元素的唯一值
【发布时间】:2017-08-10 22:01:57
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我已经用额外的细节更新了这个问题。不确定我是否已按照您的建议实施,但同时使用 .//pos./*/pos 作为选择器仍然允许我想要拒绝验证的情况。感谢您的帮助。
    • 想通了...需要使用命名空间来引用pos 的Xpath。 &lt;xs:selector xpath="./*/myNameSpace:pos"/&gt;工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多