对于我正在创建的模式,我希望有一个唯一性约束,仅在每个父节点内检查唯一性,而不是检查整个模式以查找子节点的实例。我认为最好用例子说明,见下面的xml。
我正在使用的xpath检查<subnode value="x">
的所有实例的唯一性,而我希望它仅针对<subnode value="x">
的子实例来检查唯一性,这些实例是这些实例,并且这里是clencher, <globalElement>
的单独实例
<globalElement>
<subnode value="1" />
<subnode value="2" />
</globalElement>
<globalElement>
<subnode value="1" /> <!-- Desired error here -->
<subnode value="1" /> <!-- Desired error here -->
</globalElement>
<globalElement>
<subnode value="1" /> <!-- Error here -->
<subnode value="2" />
</globalElement>
<globalElement>
<subnode value="1" /> <!-- Error here -->
<subnode value="1" /> <!-- Error here -->
</globalElement>
<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>
答案 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.