通过XML Schema实现2个元素的唯一属性

时间:2011-09-29 13:29:56

标签: xml xpath xsd unique

我有下一个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 元素只会忽略。

1 个答案:

答案 0 :(得分:0)

在MenuType声明中,省略了menuitem的元素类型。指定它并验证将起作用。