" />

Какая альтернатива для поведения xsd: sequence внутри xsd: all?

3386 просмотра

2 ответа

9574 Репутация автора

Я не понимаю, как я должен определить свой сложный тип.

Сегодня у меня есть это:

<xsd:element name="batch_requests_callbacks">
    <xsd:complexType>
      <xsd:sequence>
            <xsd:element ref="document_id" minOccurs="1" maxOccurs="1"/>
            <xsd:choice minOccurs="0" maxOccurs="1">
              <xsd:element ref="filename"/>
              <xsd:element ref="error"/>
            </xsd:choice>
            <xsd:element ref="author" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
      <xsd:attribute name="version" default="1.0"/>
    </xsd:complexType>
</xsd:element>

Но тогда xsd:sequenceважен порядок тега внутри, и я не хочу такого поведения.

Если я использую, xsd:allу меня нет порядка тегов, но я не могу установить maxOccursболее неограниченный, я не могу использовать xsd:choiceвнутриxsd:all

Каковы мои альтернативы?

Автор: Natim Источник Размещён: 16.01.2013 03:11

Ответы (2)


5 плюса

3724 Репутация автора

Решение

Вы можете использовать <xsd:choice minOccurs="0" maxOccurs="unbounded">вместо себя xsd:sequence, чтобы эмулировать неупорядоченную проверку элементов. Это обходит ограничения xsd:all.

Автор: predi Размещён: 16.01.2013 03:25

1 плюс

22702 Репутация автора

В XSD 1.0 ваши альтернативы (если вы хотите, чтобы все было просто), как вы их определили:

  • последовательность, которая требует определенного порядка
  • все, чего нет.

Если порядок не несет смысла (поэтому идентификатор документа последовательности, имя файла, автор и автор последовательности, идентификатор документа, имя файла содержат одинаковую информацию), то при исправлении последовательности не происходит потери выразительной силы. Или вы можете использовать неограниченный выбор, как это было предложено predi, и поместить часть логики проверки (проверки мощности) в другой слой приложения. Дизайнеры словаря, которые я считаю наиболее рекомендованными, обычно рекомендуют последовательность действий в этой ситуации.

Стоит упомянуть два других подхода:

  • В XSD 1.1 ограничения на maxOccurs во всех группах были сняты (хотя не другие ограничения для всех групп).
  • Поскольку нужный вам язык является обычным языком, вы можете написать для него модель контента, используя вложенные варианты и последовательности. Это становится немного утомительным из-за ограничения «уникальной атрибуции частиц» в XSD, что означает, что вы должны избегать всего, что может сделать модель контента недетерминированной, но это выполнимо. Конкретный пример показан в ответе на другой вопрос .
Автор: C. M. Sperberg-McQueen Размещён: 16.01.2013 04:14
32x32