XML Schema XSD 理解键/唯一选择器

问题描述

我有以下 XSD,目的是为 plc 元素有一个唯一的名称。我期望附加的 XML,由于名称不唯一,不应对其进行验证。当我对选择器 xpath 使用“*”而不是“plc”时,一切都按预期工作。我做错了什么?

<?xml version="1.1" encoding="UTF-8"?>
<piconfig xmlns="foobar.xsd">
    <plc name="foobar"/>
    <plc name="foobar"/>
</piconfig>

架构:

<?xml version="1.1" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="foobar" targetNamespace="foobar" elementFormDefault="qualified">
    <xs:element name="piconfig">
        <xs:complexType>
            <xs:sequence maxOccurs="unbounded">
                <xs:element name="plc">
                    <xs:complexType>
                        <xs:attribute name="name" type="xs:string" use="required"/>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
        <xs:unique name="UniquePlcName">
            <xs:selector xpath="plc"/>
            <xs:field xpath="@name"/>
        </xs:unique>
    </xs:element>
</xs:schema>

解决方法

请尝试以下 XSD。

问题是因为没有考虑命名空间。

XSD

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified" targetNamespace="foobar.xsd"
           xmlns:ns1="foobar.xsd">
    <xs:element name="piconfig">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" ref="ns1:plc"/>
            </xs:sequence>
        </xs:complexType>
        <xs:unique name="Unique_plc">
            <xs:selector xpath="ns1:plc"/>
            <xs:field xpath="@name"/>
        </xs:unique>
    </xs:element>
    <xs:element name="plc">
        <xs:complexType>
            <xs:attribute name="name" use="required" type="xs:string"/>
        </xs:complexType>
    </xs:element>
</xs:schema>