Допустимо ли иметь "выбор" элементов "группы" при определении XML-схемы (XSD)

StackOverflow https://stackoverflow.com/questions/101338

  •  01-07-2019
  •  | 
  •  

Вопрос

Допустимо ли иметь элементы "выбор" или "группа" при определении XML-схемы (XSD)

т. е.допустимо ли следующее

<xs:complexType name="HeaderType">
  <xs:sequence>
    <xs:element name="reservation-number" type="ReservationNumberType" minOccurs="1" maxOccurs="1" nillable="false" />
    <xs:choice minOccurs="1" maxOccurs="1">
      <xs:group ref="ReservationGroup" />
      <xs:group ref="CancellationGroup"/>
    </xs:choice>
  </xs:sequence>
</xs:complexType>

Где XML-сообщение может представлять, например, либо новое бронирование, либо отмену существующего бронирования.

Если сообщение предназначено для резервирования, то оно должно включать все элементы, определенные в группе ReservationGroup.

Если это отмена, то она должна включать все элементы, определенные в группе CancellationGroup.

По какой-то причине моему редактору XML (Eclipse) это не нравится, но не указывается почему.Это показывает наличие ошибки в строке <xs:complexType name="HeaderType"> но не говорит, в чем заключается ошибка

Это было полезно?

Решение

Я не специалист по XML, хотя и использую его довольно часто.Это не тот способ, которым я обычно использую подобную структуру.Я бы предпочел отдельные сложные типы, а не выбор из двух групп (см. Самый конец этого ответа).

Я подозреваю, что проблема в том, что ReservationGroup и CancellationGroup начинаются с одного и того же элемента, и в этом случае вы нарушите ограничение компонента схемы:Уникальная атрибуция частицы (ниже).

http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/#cos-nonambig

Ограничение компонента схемы:Уникальный Атрибуция частиц

Модель контента должна быть сформирована таким образом, чтобы во время · проверка · информации об элементе последовательность элементов, компонент частиц содержащийся прямо, косвенно или ·неявно· в нем, с помощью которого можно попытаться · проверить · каждый элемент в последовательности, в свою очередь, может быть уникальным определяется без изучения содержимого или атрибутов этого элемента, и без какой-либо информации о элементах в оставшейся части последовательности.

Примечание: Это ограничение реконструирует для XML-схемы эквивалентные ограничения [XML 1.0 (Второе издание)] и SGML.Учитывая наличие замены элементов группами и подстановочными знаками, краткое выражение этого ограничения затруднительно, см. Анализ ограничения на атрибуцию уникальных частиц (ненормативный) (§H) для дальнейшего обсуждения.

Например, две приведенные ниже группы являются незаконными при одном и том же выборе, потому что каждый из их первых элементов является "name", что означает, что вы не можете определить, на какую группу вы смотрите.Однако отличается ли первый элемент ReservationGroup от группы отмены бронирования (возможно, повторная отправка и отмена бронирования), тогда это действительно.

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

Группы, которые не могут сделать законный выбор

<xs:group name="ReservationGroup">
    <xs:sequence>
        <xs:element name="date"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

<xs:group name="CancellationGroup">
    <xs:sequence>
        <xs:element name="date"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

Группы, которые могут сформировать законный выбор

<xs:group name="ReservationGroup">
    <xs:sequence>
        <xs:element name="resDate"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

<xs:group name="CancellationGroup">
    <xs:sequence>
        <xs:element name="cancDate"/>
        <xs:element name="name"/>
        <xs:element name="address"/>
    </xs:sequence>
</xs:group>

Как я упоминал выше, я бы проделывал подобные вещи со сложными типами.Да, это добавляет еще один элемент, но это кажется очевидным способом, а мне нравится очевидность.

<xs:complexType name="HeaderType">
  <xs:sequence>
    <xs:element name="reservation-number" type="ReservationNumberType" minOccurs="1" maxOccurs="1" nillable="false" />
    <xs:choice minOccurs="1" maxOccurs="1">
      <xs:element name="reservation" type="ReservationType" />
      <xs:element name="cancellation" type="CancellationType" />
    </xs:choice>
  </xs:sequence>
</xs:complexType>

Другие советы

ДА.Это было потому, что и ReservationGroup, и CancellationGroup имели один и тот же первый элемент - элемент 'reservation-type' с фиксированным значением 'Reservation' в ReservationGroup и 'Cancellation' в Cancellationgroup соответственно.

Допустимо ли это, зависит от содержимого групп:если это группы моделей "последовательности" или "выбора", это совершенно законно;Группы моделей "все" являются более проблематичными и, как правило, не допускаются в данном случае.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top