0

客观的:

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

问题:

我正在使用的 xpath 针对 的所有实例检查唯一性<subnode value="x">,而我希望它仅针对<subnode value="x">其子级的实例检查唯一性,这是紧握器,单独的实例<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 模式 (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>
4

2 回答 2

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>
于 2013-07-12T14:10:10.890 回答
0

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

于 2013-07-13T00:20:15.190 回答