xsd:具有可选属性的唯一

时间:2010-12-01 11:05:28

标签: xml xsd unique

我有这个Xml文件:

<objects>
  <object name="ID1" />
  <object name="ID2" />
  <object name="ID2" color="green" />
  <object name="ID3" color="green" />
<objects>

我想针对XSD架构对此进行验证,以便namecolor之间的组合在文档中是唯一的。

问题在于,如果我使用:

<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" />

您能告诉我如何指定强制执行唯一namecolor组合的规则,并且当元素color中不存在object属性时,它检查name

2 个答案:

答案 0 :(得分:4)

使用usedefault,无论是否有以下值:          

    <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>