xsd: уникальный с необязательными атрибутами - PullRequest
6 голосов
/ 01 декабря 2010

У меня есть этот 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?

Ответы [ 2 ]

4 голосов
/ 02 июня 2014

Используйте 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>
0 голосов
/ 01 ноября 2011

Старый вопрос, но стоит ответить. Вы можете использовать более одного ограничения 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>
...