XSD для строки элементов с идентификатором атрибута

#xsd

#xsd

Вопрос:

Я хотел бы написать элемент XSD, который допускает что-то подобное :

 <CustomFields>
    <CustomField id="1">some text data</CustomField>
    <CustomField id="2">some text data</CustomField>
</CustomFields>
  

Но у меня есть некоторые ограничения: я должен ограничить текст (maxLength = 36). И я хотел бы, чтобы было невозможно иметь 2 настраиваемых поля с одинаковым идентификатором.

До сих пор я писал это, но это не то, что я хочу :

 <xs:element name="CustomFields" minOccurs="0">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="CustomField" minOccurs="0" maxOccurs="20">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:string">
                            <xs:attribute name="id" type="xs:integer" use="required"></xs:attribute>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
  

Спасибо за любую помощь.

С уважением.

Ответ №1:

Вы могли бы использовать следующую попытку

 <?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">

    <xs:simpleType name="restrictedString">
        <!-- Make a new type to be a "descendant" of string-->
        <xs:restriction base="xs:string">
            <xs:maxLength value="36"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:element name="CustomFields">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="CustomField" minOccurs="0" maxOccurs="20">
                    <xs:complexType>
                        <xs:simpleContent>
                            <!-- reference new type you declared above -->
                            <xs:extension base="restrictedString">
                                <xs:attribute name="id" type="xs:integer" use="required"/>
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
        <!-- Restrict @id to be unique-->
        <xs:unique name="id_uq">
            <xs:selector xpath="CustomField"/>
            <xs:field xpath="@id"/>
        </xs:unique>
    </xs:element>
</xs:schema>
  

Комментарии:

1. Спасибо за вашу помощь!