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

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

  •  01-07-2019
  •  | 
  •  

Вопрос

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

Я попытался сделать следующее, но XMLSpy жалуется, что «модель контента содержит элементы <element name="DateConstant"> и <element 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 соответствует моим требованиям, но для большего количества элементов он непрактичен.Ответ Херста допускает наличие двух или более элементов с одним и тем же именем, чего я не хочу.

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

Решение

Попробуй это:

<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>

При этом вы заставляете либо выбрать первый элемент, а затем остальное необязательно, либо второй элемент и остальное необязательно, либо третий элемент.

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

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

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

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

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

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

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

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

@херст,

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

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

Пока что я не могу найти решение этой проблемы, поскольку 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).

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

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