XSD架构尝试使属性值唯一

时间:2011-08-12 23:49:34

标签: xml xsd unique

我一直试图使用xs:unique到目前为止没有成功。我有以下简单的架构:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema xmlns="http://testuri/test.xsd" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://testuri/test.xsd" 
      elementFormDefault="qualified" 
      id="XMLSchema1">
      <xs:element name="root">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="items">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="item" maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:attribute name="id" type="xs:string" use="required"/>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>

使用此方法验证以下简单XML文件:

    <?xml version="1.0" encoding="utf-8" ?>
    <root xmlns="http://testuri/test.xsd">
      <items>
        <item id="1"/>
        <item id="1"/>
        <item id="1"/>
      </items>
    </root>

现在让我们说我们想让属性id唯一。我只是想将模式更改为:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema 
      xmlns="http://testuri/test.xsd" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://testuri/test.xsd" 
      elementFormDefault="qualified" id="XMLSchema1">
      <xs:element name="root">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="items">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="item" maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:attribute name="id" type="xs:string" use="required"/>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
        <xs:unique name="itemKey">
          <xs:selector xpath="items/item"/>
          <xs:field xpath="@id"/>
        </xs:unique>
      </xs:element>
    </xs:schema>

但是上面的xml仍然有效。

我最确定问题出在选择器的xpath上。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我认为你必须使用名称空间前缀限定xpath表达式(因为XPath 1.0没有默认名称空间的概念)。因此,为目标命名空间添加名称空间声明:

<xs:schema 
  xmlns="http://testuri/test.xsd" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  targetNamespace="http://testuri/test.xsd" 
  xmlns:p="http://testuri/test.xsd"
  elementFormDefault="qualified" id="XMLSchema1">

然后在xpath表达式中使用该前缀:

    <xs:unique name="itemKey">
      <xs:selector xpath="p:items/p:item"/>
      <xs:field xpath="@id"/>
    </xs:unique>

但我还没有证实这一点。