Допустимо ли иметь «выбор» элементов «группы» при определении схемы XML (XSD) - PullRequest
9 голосов
/ 19 сентября 2008

Допустимо ли иметь элементы 'choice' или 'group' при определении схемы 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) это не нравится, но не указывает, почему. Он показывает наличие ошибки в строке , но не говорит, что это за ошибка

Ответы [ 3 ]

10 голосов
/ 19 сентября 2008

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

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

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

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

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

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

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

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

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

<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>
2 голосов
/ 19 сентября 2008

Да. Это произошло потому, что и ReservationGroup, и CancellationGroup имели один и тот же первый элемент - элемент «тип резервирования» с фиксированным значением «Reservation» в группе ReservationGroup и «Cancellation» в группе Cancellation соответственно.

1 голос
/ 19 сентября 2008

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

...