我有这个Xml文件:
<objects>
<object name="ID1" />
<object name="ID2" />
<object name="ID2" color="green" />
<object name="ID3" color="green" />
<objects>
Run Code Online (Sandbox Code Playgroud)
我想验证这一点对一个XSD架构,使之间的组合name
,并color
在文档中是唯一的.
问题是,如果我使用:
<xs:unique name="UniqueObjectNameColor">
<xs:selector xpath="./object" />
<xs:field xpath="@name" />
<xs:field xpath="@color" />
</xs:unique>
Run Code Online (Sandbox Code Playgroud)
...规则将忽略object
没有可选color
属性的元素.以下验证正确,但不应该.
<object name="ID2" />
<object name="ID2" />
Run Code Online (Sandbox Code Playgroud)
你能告诉我如何指定一个强制执行唯一name
和color
组合的规则,当color
元素中没有该属性时object
,它会检查name
?
小智 6
使用use
anddefault
有或没有像这样的值:
<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>
Run Code Online (Sandbox Code Playgroud)
老问题,但值得回答。每个元素可以使用多个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>
Run Code Online (Sandbox Code Playgroud)