XML-схема, уникальная вместе на двух атрибутах - PullRequest
10 голосов
/ 02 марта 2012

У меня есть простая структура XML:

<foo>
    <bar row="42" column="2"></bar>
    <bar row="42" column="3"></bar>
</foo>

Я бы хотел, чтобы row и column из bar были уникальными вместе. Таким образом, приведенный выше пример проверяет, а следующий - нет:

<foo>
    <bar row="42" column="2"></bar>
    <bar row="42" column="3"></bar>
    <bar row="42" column="3"></bar>
</foo>

Я пытался добавить ключ к следующей схеме, но пока не нашел решения.

<xs:element name="foo">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="bar" minOccurs="1" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:string">
                            <xs:attribute name="row" type="xs:positiveInteger" use="required"/>
                            <xs:attribute name="column" type="xs:positiveInteger" use="required"/>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

1 Ответ

10 голосов
/ 06 марта 2012

Я ожидаю, что следующее сделает это.

<xsd:element name="foo">
  ...
  <xsd:unique name="rowcol">
    <xsd:selector xpath="bar"/>
    <xsd:field xpath="@row"/>
    <xsd:field xpath="@column"/>
  </xsd:unique>
</xsd:element>

Ограничение уникальности входит в объявление элемента для области уникальности, которая, как я предполагаю, составляет foo. Если ваша структура на самом деле больше похожа на:

<root>
  <foo> ... </foo>
  <foo> ... </foo>
</root>

А если вы хотите, чтобы уникальность была глобальной, тогда ограничение должно продолжаться root.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...