我有下一个xml结构:
<menubar>
<menu id="id1">
<menuitem id="id2"/>
<menuitem id="id3"/>
<menuitem id="id4"/>
<menu id="id5">
<menuitem id="id1"/> -error because has the same id as the first menu element
...
<menuitem id="id7"/>
</menu>
</menu id="id8">
<menu id="id9">
<menuitem id="id10"/>
<menuitem id="id11"/>
</menu>
...
</menubar>
口头形式:
菜单栏有* 菜单
菜单有* 菜单和* menuitem
问题:如何指定2个元素空间的独立性:菜单和 menuitem ?换句话说:所有菜单和menuitems元素在其自身和彼此之间应具有唯一的 id 属性。
菜单元素的菜单和menuitem元素的嵌套可能是无穷无尽的。
这就是我现在所拥有的:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.alexblog.me"
xmlns="http://www.alexblog.me"
elementFormDefault="qualified">
<xsd:element name="menubar" type="MenubarType">
<xsd:unique name="uniqueIdsForMenubarElements">
<xsd:selector xpath=".//*"/>
<xsd:field xpath="@id"/>
</xsd:unique>
</xsd:element>
<xsd:element name="menu" type="MenuType"/>
<xsd:element name="menuitem" type="MenuitemType" nillable="true"/>
<xsd:attributeGroup name="MenubarElementsAttributeGroup">
<xsd:attribute name="id" type="xsd:string" use="required"/>
</xsd:attributeGroup>
<xsd:complexType name="MenuitemType">
<xsd:attributeGroup ref="MenubarElementsAttributeGroup"/>
</xsd:complexType>
<xsd:complexType name="MenuType">
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element name="menu" type="MenuType"/>
<xsd:element name="menuitem"/>
</xsd:choice>
<xsd:attributeGroup ref="MenubarElementsAttributeGroup"/>
</xsd:complexType>
<xsd:complexType name="MenubarType">
<xsd:sequence>
<xsd:element ref="menu" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
它有效,但仅适用于菜单元素。 Menuitem 元素只会忽略。
答案 0 :(得分:0)
在MenuType声明中,省略了menuitem的元素类型。指定它并验证将起作用。