Я поддерживаю библиотеку XML документов, которые соответствуют немного более слабой схеме. Базовая c структура этих документов (без особых подробностей) схожа с этой:
<document>
<title/>
<section>
<title/>
<section>
<title/>
<para>...
</section>
</section>
</document>
В основном документ может состоять из заголовка, за которым следует один или несколько разделов, а раздел может состоять из заголовок, за которым следует один или несколько разделов, или последовательность других элементов, таких как абзацы, таблицы, изображения и т. д. c.
Используемая нами схема содержит следующее:
<xs:complexType name="sectiontype">
<xs:sequence>
<xs:element ref="title"/>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="section"/>
<xs:element ref="para"/>
<xs:element ref="table"/>
<xs:element ref="include"/>
<xs:element ref="graphic"/>
...
</xs:choice>
</xs:sequence>
</xs:complexType>
и использует sectiontype в качестве модели содержимого для элемента «section». К сожалению, этот контент позволяет разделу содержать два дочерних раздела с точкой между ними. Можно ли улучшить схему, чтобы раздел со смесью разделов и других элементов был недействительным? Или мне нужно преобразовать документы так, чтобы раздел разделов был одним типом элемента (назовем его родительским разделом), а раздел другого содержимого - другим (назовем его дочерним разделом)?