【问题标题】:XSD schema attempt to make attribute value uniqueXSD 模式尝试使属性值唯一
【发布时间】:2011-08-13 16:33:59
【问题描述】:

到目前为止,我一直在尝试使用 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 上。有什么想法吗?

【问题讨论】:

    标签: xml xsd unique


    【解决方案1】:

    我认为您必须使用命名空间前缀来限定 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>
    

    不过,我还没有验证这一点。

    【讨论】:

    • 就是这样。我应该看到节点名称限定。非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 2011-07-29
    相关资源
    最近更新 更多