我有这个Xml文件:
<objects>
<object name="ID1" />
<object name="ID2" />
<object name="ID2" color="green" />
<object name="ID3" color="green" />
<objects>
我想针对XSD架构对此进行验证,以便name
和color
之间的组合在文档中是唯一的。
问题在于,如果我使用:
<xs:unique name="UniqueObjectNameColor">
<xs:selector xpath="./object" />
<xs:field xpath="@name" />
<xs:field xpath="@color" />
</xs:unique>
...如果没有可选的object
属性,规则将忽略color
个元素。以下验证正确,但不应该。
<object name="ID2" />
<object name="ID2" />
您能告诉我如何指定强制执行唯一name
和color
组合的规则,并且当元素color
中不存在object
属性时,它检查name
?
答案 0 :(得分:4)
使用use
和default
,无论是否有以下值:
<element name="objects">
<complexType>
<sequence>
<element name="object" maxOccurs="unbounded">
<complexType>
<attribute name="name" type="string" />
<attribute name="color" type="string" use="optional" default="noColor" />
</complexType>
</element>
</sequence>
</complexType>
<unique name="UniqueObjectNameColor">
<selector xpath="tns:object" />
<field xpath="@name" />
<field xpath="@color" />
</unique>
</element>
</schema>
答案 1 :(得分:0)
老问题,但值得回答。您可以为每个元素使用多个unique
约束。这可以做你想要的:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/xsdunique-with-optional-properties"
xmlns:tns="http://www.example.org/xsdunique-with-optional-properties"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<element name="objects">
<complexType>
<sequence>
<element name="object" maxOccurs="unbounded">
<complexType>
<attribute name="name" type="string" />
<attribute name="color" type="string" />
</complexType>
</element>
</sequence>
</complexType>
<unique name="UniqueObjectName">
<selector xpath="tns:object" />
<field xpath="@name" />
</unique>
<unique name="UniqueObjectNameColor">
<selector xpath="tns:object" />
<field xpath="@name" />
<field xpath="@color" />
</unique>
</element>
</schema>