Xml XSD架构试图使属性值唯一
我一直在尝试使用xs:unique,但迄今为止没有成功。我有以下简单的模式:Xml XSD架构试图使属性值唯一,xml,xsd,unique,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" eleme
<?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。有什么想法吗?我认为必须使用名称空间前缀限定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>
不过,我还没有证实这一点。就是这样。我应该看到节点名称限定。谢谢