Уникальный атрибут для 2 элементов через XML-схему - PullRequest
0 голосов
/ 29 сентября 2011

У меня есть следующая структура 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>

Устная форма: меню имеет * меню menu имеет * menu и * menuitem

Вопрос : как указать уникальность для пространства из 2 элементов: menu и menuitem ?Другими словами: все элементы меню и элементы меню должны иметь уникальные атрибуты id между собой и между собой.

Вложение элементов меню и элементов меню для элемента меню может быть бесконечным.

Вот что у меня сейчас:

<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 голосов
/ 30 сентября 2011

В объявлении MenuType тип элемента для menu menu не указан. Укажите его, и проверка будет работать.

...