问题描述
我有以下 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>