Конструкция схемы 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 позволяет использовать два или более элемента с тем же именем, которые я не хочу.
Ответы
Ответ 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).
Следовательно, теперь у вас есть "любой один или несколько" из этих двух элементов. Конечно, это становится экспоненциально более сложным, тем больше возможностей у вас есть, поскольку вам необходимо предоставить дополнительные варианты для всех возможных комбинаций.