XML属性唯一性

时间:2015-10-29 23:28:35

标签: xml xsd

我想强制执行唯一属性。我已经阅读了很多指南并尝试了很多配置,但我似乎无法得到它。我使用了两种不同的验证器,XML Copy Editor和http://www.xmlvalidation.com/。我做错了什么?

以下是被认为有效的xml:

<?xml version="1.0"?>
<stuff xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com test.xsd">
  <thing att="hi">
    <test>Hi</test>
  </thing>
  <thing att="hi">
    <test>Hi</test>
  </thing>
</stuff>

这是架构:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
<xs:element name="stuff">
  <xs:complexType>
    <xs:sequence>
    <xs:element name="thing" maxOccurs="unbounded">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="test" type="xs:string"/>
        </xs:sequence>
        <xs:attribute name="att" type="xs:string"/>
      </xs:complexType>
      <xs:unique name="thing">
        <xs:selector xpath="thing"/>
        <xs:field xpath="@att"/>
      </xs:unique>
    </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

1 个答案:

答案 0 :(得分:0)

要正确验证XML文档,您必须执行以下操作:

  1. xs:unique声明移至stuff元素声明(thing元素没有名为thing的子元素; XPath表达式相对于父元素)。
  2. 使用命名空间前缀(如果要在XSD中使用XPath,请不要使用默认命名空间。)
  3. 您的XSD应该重写如下:

    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.w3schools.com"
            xmlns:p="http://www.w3schools.com"
            elementFormDefault="qualified">
    
    
    <xs:element name="stuff">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="thing" maxOccurs="unbounded">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element name="test" type="xs:string"/>
                            </xs:sequence>
                            <xs:attribute name="att" type="xs:string"/>
                        </xs:complexType>
    
                    </xs:element>
                </xs:sequence>
            </xs:complexType>
            <xs:unique name="thing">
                <xs:selector xpath="p:thing"/>
                <xs:field xpath="@att"/>
            </xs:unique>
        </xs:element>
    </xs:schema>