我今天想了很多这个问题。我正在考虑这条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>
它们本质上是递归嵌套组的选择。我想写这篇文章的人是在一个安全的机构里度过余生,每天接受几次强制服药。
我希望这会有所帮助。我认为这说明了超级灵活模式是如何在 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 组的无限出现,即它是一个具有无限根选择的选择树。
卢克