XSD <xs: key> отдельные ограничения уникальности для разных элементов? - PullRequest
2 голосов
/ 01 апреля 2019

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

Я пытаюсь сделать что-то вроде этого:

Рассмотрим этот пример XML, я вынужден использовать (упрощенно)

.
.
.

<categories>
      <orange id="1" value="10">...</orange>
      <orange id="2" value="10">...</orange>
      <brown id="1" value="10">...</brown>
      <brown id="2" value="10">...</brown>
      <brown id="3" value="10">...</brown>
      .
      .
      .
</categories>

В основном я хочучтобы гарантировать, что идентификатор уникален для всех оранжевых и коричневых категорий, но не уникален в целом.

Мой первоначальный XSD будет выглядеть примерно так:

.
.
.
<xs:element name="categories">
 <xs:complexType>
  <xs:choice maxOccurs="unbounded">
   <xs:element name="orange">
     <xs:complexType>
      <xs:attribute name="id" type="xs:integer" use="required"/>
      <xs:attribute name="value" type="xs:integer" use="required"/>
     </xs:complexType>
    </xs:element>
    <xs:element name="brown ">
     <xs:complexType>
      <xs:attribute name="id" type="xs:integer" use="required"/>
      <xs:attribute name="value" type="xs:integer" use="required"/>
     </xs:complexType>
    </xs:element>
   </xs:choice>
 </xs:complexType> 

 <xs:key name="catKeys">
  <xs:selector xpath="/*" />
  <xs:field    xpath="@id" />
 </xs:key>

</xs:element>

Над XSD проверяется уникальность идентификаторапо всем категориям -> XML не будет проверяться.

1 Ответ

2 голосов
/ 01 апреля 2019

Ты очень близко. Просто используйте два xs:key элемента, по одному для каждого из orange и brown:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="categories">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">
        <xs:element name="orange">
          <xs:complexType>
            <xs:attribute name="id" type="xs:integer" use="required"/>
            <xs:attribute name="value" type="xs:integer" use="required"/>
          </xs:complexType>
        </xs:element>
        <xs:element name="brown ">
          <xs:complexType>
            <xs:attribute name="id" type="xs:integer" use="required"/>
            <xs:attribute name="value" type="xs:integer" use="required"/>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType> 

    <xs:key name="orangeKeys">
      <xs:selector xpath="orange"/>
      <xs:field    xpath="@id"/>
    </xs:key>

    <xs:key name="brownKeys">
      <xs:selector xpath="brown"/>
      <xs:field    xpath="@id"/>
    </xs:key>
  </xs:element>

</xs:schema>

Тогда ваш XML будет действительным, учитывая, что он содержит уникальные id элементы с областями, отдельными для orange против brown элементов.

...