【问题标题】:XSD: how to use 'unique' & 'key'/'keyref' with element values?XSD:如何将 'unique' & 'key'/'keyref' 与元素值一起使用?
【发布时间】:2011-02-20 06:28:03
【问题描述】:

我尝试将<xs:unique><xs:key>/<xs:keyref> 与元素值一起使用,但我无法让它工作。如果我用属性值来做这件事,它就像一个魅力。

Test.xml

<test:config xmlns:test="http://www.example.org/Test"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/Test Test.xsd ">

    <test:location id="id1" path="/path2">
        <test:roles>
            <test:role>role1</test:role>
            <test:role>role2</test:role>
            <test:role>role2</test:role> <!-- DUPLICATE: FAIL VALIDATION  -->
        </test:roles>
        <test:action name="action1">
            <test:roles>
                <test:role>role1</test:role>
                <test:role>role1</test:role> <!-- DUPLICATE: FAIL VALIDATION -->
                <test:role>role3</test:role> <!-- NOT DEFINED: FAIL VALIDATION -->
            </test:roles>
        </test:action>
    </test:location>

</test:config>

我要确保 roles 只定义一次,并且 action 元素下定义的 roles 只是在上层定义的那些.

Test.xsd

<xs:element name="config">
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="test:location" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>       
</xs:element>

<xs:element name="location" type="test:LocationType">
    <xs:key name="keyRole">
        <xs:selector xpath="test:roles" />
        <xs:field xpath="test:role" />
    </xs:key>
    <xs:keyref name="keyrefRole" refer="test:keyRole">
        <xs:selector xpath="test:action/test:roles" />
        <xs:field xpath="test:role" />
    </xs:keyref>
</xs:element>

<xs:complexType name="LocationType">
    <xs:sequence>
        <xs:element ref="test:roles" minOccurs="0" />
        <xs:element name="action" type="test:ActionType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="id" type="xs:string" use="required"/>
    <xs:attribute name="path" type="xs:string" use="required"/>
</xs:complexType>

<xs:element name="roles" type="test:RolesType">
    <xs:unique name="uniqueRole">
        <xs:selector xpath="." />
        <xs:field xpath="test:role" />
    </xs:unique>
</xs:element>

<xs:complexType name="RolesType">
    <xs:sequence>
        <xs:element name="role" type="xs:string" maxOccurs="unbounded"/>
    </xs:sequence>      
</xs:complexType>

<xs:complexType name="ActionType">
    <xs:sequence>
        <xs:element ref="test:roles" />
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>

验证失败并显示以下消息:

Description Resource    Path    Location    Type
cvc-identity-constraint.3: Field "./test:role" of identity constraint "keyrefRole" matches more than one value within the scope of its selector; fields must match unique values.   Test.xml    /filebrowser-ejb/src/test/resources line 15 XML Problem
cvc-identity-constraint.3: Field "./test:role" of identity constraint "keyrefRole" matches more than one value within the scope of its selector; fields must match unique values.   Test.xml    /filebrowser-ejb/src/test/resources line 16 XML Problem
cvc-identity-constraint.3: Field "./test:role" of identity constraint "keyRole" matches more than one value within the scope of its selector; fields must match unique values.  Test.xml    /filebrowser-ejb/src/test/resources line 9  XML Problem
cvc-identity-constraint.3: Field "./test:role" of identity constraint "keyRole" matches more than one value within the scope of its selector; fields must match unique values.  Test.xml    /filebrowser-ejb/src/test/resources line 10 XML Problem
cvc-identity-constraint.3: Field "./test:role" of identity constraint "uniqueRole" matches more than one value within the scope of its selector; fields must match unique values.   Test.xml    /filebrowser-ejb/src/test/resources line 9  XML Problem
cvc-identity-constraint.3: Field "./test:role" of identity constraint "uniqueRole" matches more than one value within the scope of its selector; fields must match unique values.   Test.xml    /filebrowser-ejb/src/test/resources line 10 XML Problem
cvc-identity-constraint.3: Field "./test:role" of identity constraint "uniqueRole" matches more than one value within the scope of its selector; fields must match unique values.   Test.xml    /filebrowser-ejb/src/test/resources line 15 XML Problem
cvc-identity-constraint.3: Field "./test:role" of identity constraint "uniqueRole" matches more than one value within the scope of its selector; fields must match unique values.   Test.xml    /filebrowser-ejb/src/test/resources line 16 XML Problem
cvc-identity-constraint.4.1: Duplicate unique value [role1] declared for identity constraint "uniqueRole" of element "roles".   Test.xml    /filebrowser-ejb/src/test/resources line 9  XML Problem
cvc-identity-constraint.4.1: Duplicate unique value [role1] declared for identity constraint "uniqueRole" of element "roles".   Test.xml    /filebrowser-ejb/src/test/resources line 15 XML Problem
cvc-identity-constraint.4.2.2: Duplicate key value [role1] declared for identity constraint "keyRole" of element "location".    Test.xml    /filebrowser-ejb/src/test/resources line 9  XML Problem
cvc-identity-constraint.4.3: Key 'keyrefRole' with value 'role3' not found for identity constraint of element 'location'.   Test.xml    /filebrowser-ejb/src/test/resources line 19 XML Problem

如果我注释掉应该失败的行,验证仍然会失败并显示这些消息:

Description Resource    Path    Location    Type
cvc-identity-constraint.3: Field "./test:role" of identity constraint "keyRole" matches more than one value within the scope of its selector; fields must match unique values.  Test.xml    /filebrowser-ejb/src/test/resources line 10 XML Problem
cvc-identity-constraint.3: Field "./test:role" of identity constraint "uniqueRole" matches more than one value within the scope of its selector; fields must match unique values.   Test.xml    /filebrowser-ejb/src/test/resources line 10 XML Problem

我做错了什么?

【问题讨论】:

  • 注意:文本内嵌的 XML 标记(在您帖子的第一行中)需要在它们周围加上反引号,否则它们会被 SO 吃掉。我帮你修好了。

标签: xml schema xsd


【解决方案1】:

该字段需要标识选择器中的单个项目。你需要更多类似的东西:

    <xs:selector xpath="test:roles/test:role" />
    <xs:field xpath="." />

【讨论】:

  • 像魅力一样工作。我以为我尝试了所有组合,但显然没有。
猜你喜欢
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 2010-10-27
  • 2017-06-11
  • 2016-08-03
相关资源
最近更新 更多