我一直在尝试将UNIQUE
约束置于我在相当基本的 XSD 架构中的某些属性上。我正在使用 XMLSpy,我想为我的节点在 TEMPLATE.ID 周围设置一个唯一约束(即它们保持唯一很重要)。
我已将以下内容放在适当的位置并尝试了以下内容:
情景 1
<xs:unique name="uniqueviewid">
<xs:selector xpath="./views"/>
<xs:field xpath="@id"/>
</xs:unique>
结果: XSD:验证成功。XML 验证但不支持唯一约束(即不选取具有相同 id 的两个或多个元素
方案 2
<xs:unique name="uniqueviewid">
<xs:selector xpath="views"/>
<xs:field xpath="@id"/>
</xs:unique>
**结果* 与场景 1 相同。XSD 验证、XML 验证但忽略@id
视图元素中的重复项
方案 3
<xs:unique name="uniqueviewid">
<xs:selector xpath="*"/>
<xs:field xpath="@id"/>
</xs:unique>
结果:XSD Validates 和 XML Validats 并且它尊重 UNIQUE 约束(即,如果使用@id
它的重复视图会根据设计引发失效)。
问题是通配符是“*”,这意味着 VIEWPODS 下的所有子节点都将被验证,这不是我想要的。相反,我希望约束集中在 VIEWPOS/VIEWS/@ID 确切路径上。
我认为我的 XPATH 都是错误的,但我想不出我做错了什么?
示例 XML。
这是示例 XML。
<config xmlns="http://tempuri.org/RIAGenicConfig.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tempuri.org/RIAGenicConfig.xsd RIAGenicConfig.xsd">
<view>
<viewpods>
<views id="view1"/>
<views id="view1"/>
</viewpods>
</view>
</config>
有问题的 XSD。
<xs:schema xmlns="http://tempuri.org/RIAGenicConfig.xsd" xmlns:mstns="http://tempuri.org/RIAGenicConfig.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://tempuri.org/RIAGenicConfig.xsd" elementFormDefault="qualified" id="RIAGenicConfig">
<xs:element name="config">
<xs:complexType>
<xs:sequence>
<xs:element name="view">
<xs:complexType>
<xs:choice>
<xs:element name="viewpods">
<xs:complexType>
<xs:choice>
<xs:element name="views" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="id"/>
</xs:complexType>
</xs:element>
<xs:element name="blah"/>
</xs:choice>
</xs:complexType>
<xs:unique name="uniqueviewid">
<xs:selector xpath="*"/>
<xs:field xpath="@id"/>
</xs:unique>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>