XML Schema:仅在EACH父节点内的子节点属性值的唯一性?

时间:2013-07-12 13:59:36

标签: xml xpath xsd xml-validation

目的:

对于我正在创建的模式,我希望有一个唯一性约束,仅在每个父节点内检查唯一性,而不是检查整个模式以查找子节点的实例。我认为最好用例子说明,见下面的xml。

问题:

我正在使用的xpath检查<subnode value="x">的所有实例的唯一性,而我希望它仅针对<subnode value="x">的子实例来检查唯一性,这些实例是这些实例,并且这里是clencher, <globalElement> 的单独实例

具有所需错误的XML:

<globalElement>
    <subnode value="1" />
    <subnode value="2" />
</globalElement>

<globalElement>
    <subnode value="1" />            <!-- Desired error here -->
    <subnode value="1" />            <!-- Desired error here -->
</globalElement>

带有当前错误的XML:

<globalElement>
    <subnode value="1" />           <!-- Error here -->
    <subnode value="2" />
</globalElement>

<globalElement>
    <subnode value="1" />            <!-- Error here -->
    <subnode value="1" />            <!-- Error here -->
</globalElement>

XML Schema(1.0):

<xs:element name="rootElement">
    <xs:complexType>
         <xs:choice minOccurs="0" maxOccurs="unbounded" >
             <xs:any namespace="##targetNamespace"  />
         </xs:choice>
    </xs:complexType>       
     <xs:unique name="name_check">
          <xs:selector xpath=".//prefix:globalElement/prefix:subnode" />
          <xs:field xpath="@value" />
     </xs:unique>
</element>

2 个答案:

答案 0 :(得分:1)

我认为您应该在该父元素上定义唯一约束 - 在本例中为globalElement

<xs:element name="GlobalElement">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="SubNode" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:attribute name="value" use="required"/>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:unique name="name_check">
        <xs:selector xpath="SubNode"/>
        <xs:field xpath="@value"/>
    </xs:unique>
</xs:element>

答案 1 :(得分:0)

如果保持简单,那么模式中的唯一约束非常简单。如果你希望A中的每个B都有一个C的唯一值(例如,一个国家内的每个人都有一个唯一的护照号码值),那么你应该在元素A的级别定义约束,选择器应该选择B相对于A,该字段应选择C相对于B.