Схема Xml: как определить ключ/keyref для разных элементов в одной группе?

У меня есть эта часть моего xsd:

<!-- FIELDGROUP - groups all available field types -->
<xsd:group name="FieldGroup">
    <xsd:choice id="fieldset-fields">
        <xsd:element name="TextField" type="textfield-type" maxOccurs="unbounded" />
        <xsd:element name="NumberField" type="numberfield-type" maxOccurs="unbounded" />
        <xsd:element name="Button" type="button-type" maxOccurs="unbounded" />
    </xsd:choice>
</xsd:group>

Все эти типы элементов (тип текстового поля, тип числового поля, тип кнопки) расширяют общий тип field-type:

<!-- Fieldset -> FIELD-TYPE: the base type of all possible field elements -->
<xsd:complexType id="field-type" name="field-type" abstract="true" mixed="false">
    <xsd:sequence>
        <xsd:element name="Label" type="label-type" minOccurs="0" maxOccurs="1" />
        <xsd:group ref="FieldValidationGroup" />
    </xsd:sequence>

    <xsd:attribute id="field-type-id" name="id" type="id-type" use="required" />
    <xsd:attribute id="field-type-css-class" name="css-class" use="optional" type="css-class-type" />
</xsd:complexType>

Теперь я хочу создать ключ, который уникален среди всех элементов непосредственно в FieldGroup — независимо от того, каким элементом они на самом деле являются, и иметь возможность ссылаться на них из некоторых элементов в FieldValidationGroup.

Или: как я могу определить ключ на field-type, чтобы он производился для всех других элементов, расширяющих тип поля?

Как видите, в настоящее время у меня есть идентификатор, но этот идентификатор также уникален среди всех других элементов, не входящих в группу полей, и это может привести к неправильным ссылкам.

Как я могу этого добиться?


person Sebastian P.R. Gingter    schedule 19.08.2011    source источник


Ответы (1)


Основываясь на вашем общем подходе, основанном на повторном использовании - через xsd:group и иерархии типов - я делаю вывод, что вы также хотите иметь возможность "повторно использовать" определения ключей. Если это правда, то краткий ответ: это невозможно сделать. key, keyref и unique, также известные как компоненты схемы определения ограничения идентификации, могут быть вложены только в объявления элементов. Нельзя определить ключ, связанный с xsd:group, чтобы он работал «независимо от того, какими элементами они являются на самом деле», или «определить ключ» для типа, «чтобы он производился для всех других элементов».

person Petru Gardea    schedule 05.09.2011
comment
Печально, что сделать подобное невозможно. Было бы интуитивно понятно иметь возможность сделать это. - person Sebastian P.R. Gingter; 05.09.2011