我似乎无法让XPATH适合XSD UNIQUE Con​​straint

时间:2009-08-30 01:55:01

标签: xml unique-constraint

我一直试图在一个相当基本的XSD架构中对我的某些属性进行UNIQUE约束。我正在使用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 constrint(即如果@id的重复视图按照设计抛出一个invaldation)。

问题是外卡是“*”,这意味着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>

1 个答案:

答案 0 :(得分:4)

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

<xs:unique name="uniqueviewid">
  <xs:selector xpath="mstns:views"/>
   <xs:field xpath="@id"/>
</xs:unique>