4

我一直在尝试将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>
4

1 回答 1

4

限定mstns:views的 xpath 选择而不是 *(所有元素):

<xs:unique name="uniqueviewid">
  <xs:selector xpath="mstns:views"/>
   <xs:field xpath="@id"/>
</xs:unique>
于 2009-08-30T02:02:43.860 回答