Сделать содержимое элемента уникальным в xsd - PullRequest
0 голосов
/ 02 мая 2020

У меня есть элемент:

<xsd:element name="tags" type="tagsType"></xsd:element>

Это tagsType:

<xsd:complexType name="tagsType">
        <xsd:sequence>
            <xsd:element name="t" minOccurs="0" maxOccurs="unbounded">
                <xsd:complexType>
                    <xsd:simpleContent>
                        <xsd:extension base="xsd:string">
                            <xsd:attribute name="tagname" type="xsd:string"></xsd:attribute>
                        </xsd:extension>
                    </xsd:simpleContent>
                </xsd:complexType>
                <xsd:key name="tagKey">
                    <xsd:selector xpath="tags/tag"/>
                    <xsd:field xpath="@tagname"/>
                </xsd:key>
            </xsd:element>
        </xsd:sequence>
</xsd:complexType>

Как я ограничил атрибут tagname, чтобы он был уникальным, но я хочу сделать контент этого тега также уникален. Пример:

<tags>
    <t>tag1</t>
    <t>tag1</t>
    <t>tag2</t>
</tags>

Это не должно проверяться из-за дубликата tag1. Это должно подтвердить:

<tags>
    <t>tag1</t>
    <t>tag2</t>
    <t>tag3</t>
</tags>

Как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Вы можете достичь желаемого результата с помощью следующего XSD.
Он использует элемент xsd:unique, чтобы убедиться, что значения уникальны.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <xsd:complexType name="tagsType">
        <xsd:sequence>
            <xsd:element name="t" type="xsd:string"  minOccurs="0" maxOccurs="unbounded" />
        </xsd:sequence>
    </xsd:complexType>

    <xsd:element name="tags" type="tagsType">
        <xsd:unique name="t_unique" >
            <xsd:selector xpath="t"/>
            <xsd:field xpath="."/>
        </xsd:unique>
    </xsd:element>

</xsd:schema>

Этот XSD проверяет второй XML и терпит неудачу на первом.


Элемент xsd: unique имеет два подэлемента:

Элемент xsd: unique ДОЛЖЕН содержать следующее (по порядку):

  • один и только один элемент xsd: selector (содержит выражение XPath, которое указывает набор элементов, для которых значения, указанные в поле, должны быть уникальными)
  • один или несколько xsd: field элементы (содержит выражение XPath, которое задает значения, которые должны быть уникальными для набора элементов, указанного элементом селектора)
0 голосов
/ 03 мая 2020

Если вы хотите, чтобы каждый X в Y имел уникальное значение для Z, то:

(a) объявление Y должно содержать ограничение xs:unique

(b) селектор должен быть выражением пути, которое выбирает X, начиная с Y

(c), поле должно быть выражением пути, которое выбирает Z, начиная с X.

Итак, фундаментальная ошибка, которую вы ' Мы сделали, чтобы определить ограничение на неправильном уровне. xs:unique не принадлежит тому, что вы хотите быть уникальным, оно принадлежит содержащему его элементу, внутри которого он должен быть уникальным.

Это потому, что действительность элемента зависит только от его содержимого, и не в его контексте. Если два X имеют одинаковое значение для Z, недопустимо содержащее Y.

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