xsd:具有可选属性的唯一

Vit*_*tor 6 xml xsd unique

我有这个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)

你能告诉我如何指定一个强制执行唯一namecolor组合的规则,当color元素中没有该属性时object,它会检查name

小智 6

使用useanddefault有或没有像这样的值:

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


mic*_*fra 1

老问题,但值得回答。每个元素可以使用多个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)

  • 您好,micfra,感谢您的回复。我希望这是有效的: `&lt;object name="ID2" /&gt;&lt;object name="ID2" color="green" /&gt;` 对于您的 'UniqueObjectName' 约束,这将是无效的。我只想避免精确副本:无效:`&lt;object name="ID2" /&gt;&lt;object name="ID2" /&gt;` 无效:`&lt;object name="ID2" color="green" /&gt;&lt;对象名称=“ID2”颜色=“绿色”/&gt;` (2认同)