То, что я пытаюсь выполнить, - это создание XML-схемы, описывающей XML-файл, который может принимать одну из двух форм. Существует раздел общих элементов между ними, а затем небольшой раздел, который отличается. Что-то вроде:XML-выбор без вложенности
<Dessert>
<Identifier> Hot Fudge Sundae </Identifier>
<SaleDate> 2013-06-03 </SaleDate>
<Duration> 2 </Duration>
<Size> SuperScooper </Size>
</Dessert>
<Dessert>
<Identifier> Dutch Apple Pie </Identifier>
<SaleDate> 2013-06-03 </SaleDate>
<Duration> 1 </Duration>
<AlaMode> 1 </AlaMode>
<IceCreamFlavor> Vanilla </IceCreamFlavor>
</Dessert>
Так для кремовых десертов льда есть только Размер в то время как для пирогов есть более AlaMode индикатор и IceCreamFlavor спецификатор.
То, что я хочу сделать, чтобы использовать xs:choice
спецификатор, чтобы указать, что Dessert
XML либо иметь один или другой (Size
или AlaMode
и IceCreamFlavor
), так что я могу проверить их.
То, что я пытался сделать, это создать два типа, и сделать что-то вроде этого:
, а затем сделать что-то вроде:
<xs:choice>
<xs:element name="Sundae" type="SundaeType" />
<xs:element name="Pie" type="PieType" />
</xs:choice>
И но полученный XML, конечно, имеет макет так:
<Dessert>
<Identifier> Hot Fudge Sundae </Identifier>
<SaleDate> 2013-06-03 </SaleDate>
<Duration> 2 </Duration>
<Sundae>
<Size> SuperScooper </Size>
<Sundae>
</Dessert>
Который не соответствует существующей файловой структуры.
Я могу просто объединить все возможные элементы и покончить с вещами xs:choice
, но это действительно не передает ожиданий формата (то есть, например, недействительно для sundae иметь AlaMode
элемент).
Есть ли способ сделать это? Я подозреваю, что если бы у меня было только одно поле, я мог бы выполнить это с помощью xs:choice
(возможно) и не иметь этого дополнительного уровня. Или, может быть, я просто что-то пропустил.
И да, я понимаю, что макет не самый лучший, но это существующий формат, который я действительно могу изменить на этом этапе.
Спасибо за ответ. Это было полезно для меня. – itsmatt