Подтвердить что ты не робот

Конструкция схемы XML для "любого одного или нескольких из этих элементов, но должна быть как минимум одна"

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

Я попытался сделать следующее, но XMLSpy жалуется, что "модель контента содержит элементы < element name=" DateConstant " > и < элемент name=" DateConstant " > , которые не могут быть определены однозначно".

    <xs:choice>
        <xs:sequence>
            <xs:element name="DateConstant"/>
            <xs:element name="TimeConstant"/>
        </xs:sequence>
        <xs:element name="DateConstant"/>
        <xs:element name="TimeConstant"/>
    </xs:choice>

Можно ли это сделать (и если да, то как)?

Некоторые разъяснения: Я только хочу разрешить один из каждого элемента с тем же именем. Может быть один "DateConstant" и/или один "TimeConstant", но не два. Ответ Gizmo соответствует моим требованиям, но это нецелесообразно для большего количества элементов. Ответ Hurst позволяет использовать два или более элемента с тем же именем, которые я не хочу.

4b9b3361

Ответ 1

Попробуйте следующее:

<xs:choice>
  <xs:sequence>
    <xs:element name="Elem1" />
    <xs:element name="Elem2" minOccurs="0" />
    <xs:element name="Elem3" minOccurs="0" />
  </xs:sequence>
  <xs:sequence>
    <xs:element name="Elem2" />
    <xs:element name="Elem3" minOccurs="0" />
  </xs:sequence>
  <xs:element name="Elem3" />
</xs:choice>

Таким образом, вы вынуждаете либо выбрать первый элемент, а затем остальное необязательно, либо второй элемент, либо остальное является необязательным, либо третьим элементом.

Это должно делать то, что вы хотите, я надеюсь.

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

Ответ 2

В соответствии с технической статьей MSDN под названием Общие сведения о схеме XML at http://msdn.microsoft.com/en-us/library/aa468557.aspx#understandxsd_topic5 вы можете воспользоваться ограничениями, такими как minOccurs на самом определении выбора (compositor):

"Использование ограничений ввода для компоновщика применяется ко всей группе в целом"

(см. более сложный пример, в котором используются вложенные сложные типы и пример AuthorType)

Вы заявили о своем требовании как "хотя бы один из элементов должен присутствовать, и может быть более одного из них". Таким образом, я предлагаю вам попробовать следующее:

<xs:choice minOccurs="1" maxOccurs="unbounded">
    <xs:element name="DateConstant" type="..."/>
    <xs:element name="TimeConstant" type="..."/>
</xs:choice>

Ответ 3

@hurst,

К сожалению, вы не поняли исходный вопрос. Размещение minOccurs = "1" на выбор выполняется автоматически, когда ВСЕ элементы, которые имеют minOccurs = "0", содержатся в качестве параметров.

Таким образом, вы не учли "по крайней мере один", требуемый оригинальным плакатом, потому что ни один элемент не удовлетворяет 1 из двух полностью необязательных элементов.

Пока я не могу найти решение для этого, поскольку minOccur/maxOccur относятся к группе, в которой они определены, и НЕ относятся к общему количеству узлов. Вы также не можете использовать элемент выбора для определения одного и того же именованного элемента более одного раза или он становится "неоднозначным". Я видел, что некоторые примеры используют ссылки вместо элементов определенного типа, но я считаю, что это не скомпоновало синтаксический анализатор Microsoft XSD.

<xs:choice minOccurs="1" maxOccurs="1">
  <xs:sequence minOccurs="1" maxOccurs="1">
    <xs:element name="Elem1" minOccurs="1" maxOccurs="1" />
    <xs:element name="Elem2" minOccurs="0" maxOccurs="1" />
  </xs:sequence>
  <xs:sequence >
    <xs:element name="Elem2" minOccurs="1" maxOccurs="1" />
  </xs:sequence>
</xs:choice>

Здесь вы можете увидеть, что либо у вас есть первая последовательность (которая ДОЛЖНА иметь Elem1, но может иметь Elem2 опционально), либо у вас есть вторая последовательность (которая ДОЛЖНА иметь Elem2).

Следовательно, теперь у вас есть "любой один или несколько" из этих двух элементов. Конечно, это становится экспоненциально более сложным, тем больше возможностей у вас есть, поскольку вам необходимо предоставить дополнительные варианты для всех возможных комбинаций.