Я много думал об этой проблеме сегодня.Я размышлял о том, насколько трудно это правило xs:all
заставляет базы данных XML хранить документы, которые имеют неструктурированные данные типа CMS, а также проверять данные.
Затем мне пришло в голову, что XHTML допускает очень гибкуюрасположение вложенных элементов в любом порядке, в котором вам нужно пометить страницу.
Итак, вот выдержка из схемы XHTML 1.1:
<xs:group name="InlForm.class">
<xs:choice>
<xs:element ref="input"/>
<xs:element ref="select"/>
<xs:element ref="textarea"/>
<xs:element ref="label"/>
<xs:element ref="button"/>
</xs:choice>
</xs:group>
<xs:group name="Inline.extra">
<xs:choice/>
</xs:group>
<xs:group name="Ruby.class">
<xs:sequence>
<xs:element ref="ruby"/>
</xs:sequence>
</xs:group>
<!--
Inline.class includes all inline elements,
used as a component in mixes
-->
<xs:group name="Inline.class">
<xs:choice>
<xs:group ref="InlStruct.class"/>
<xs:group ref="InlPhras.class"/>
<xs:group ref="InlPres.class"/>
<xs:group ref="I18n.class"/>
<xs:group ref="Anchor.class"/>
<xs:group ref="InlSpecial.class"/>
<xs:group ref="InlForm.class"/>
<xs:group ref="Ruby.class"/>
<xs:group ref="Inline.extra"/>
</xs:choice>
</xs:group>
<xs:group name="Heading.class">
<xs:choice>
<xs:element ref="h1"/>
<xs:element ref="h2"/>
<xs:element ref="h3"/>
<xs:element ref="h4"/>
<xs:element ref="h5"/>
<xs:element ref="h6"/>
</xs:choice>
</xs:group>
Они, по сути, вкладывают выбор групп, рекурсивно.Я предполагаю, что человек, который написал это, прожил остаток своих дней в безопасном учреждении, получая принудительные лекарства несколько раз в день.
Надеюсь, это поможет.Я думаю, что это иллюстрирует, как супер-flexi-схемы «действительно» выполняются в XSD 1.0.
Редактировать - это работает!Вы можете создать «основную» группу из всех других групп и использовать этот пример определения элемента ListItem
, чтобы разрешить непрерывно вложенные элементы в любом порядке.Убедитесь, что ListItem
также включен в группу, чтобы рекурсия работала.
<xs:element name="ListItem">
<xs:complexType>
<xs:sequence>
<xs:group ref="content:any.mix" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Итак, моя группа any.mix
выглядит следующим образом:
<xs:group name="any.mix">
<xs:choice>
<xs:group ref="content:item.class" />
<xs:group ref="content:media.class" />
<xs:group ref="content:data.class" />
<xs:group ref="content:list.class" />
</xs:choice>
</xs:group>
И каждый из этих "классов"группы содержат еще больше вариантов выбора групп и т. д. и т. д. до тех пор, пока они в конце концов не достигнут элементов, если хотите, фактических тегов конечного уровня.
Сами группы не должны иметь циклических ссылок;«хитрость» заключается в неограниченных вхождениях группы any.mix
, то есть это дерево выбора с неограниченным корневым выбором.
Люк