XML-схема: maxOccurs, minOccurs

Когда я запускаю свой код, это дает мне эту ошибку

[ s4s-att-not-allowed: Attribute 'maxOccurs' cannot appear in element 'element'.]

Вот моя схема:

<xs:element name="parameters" maxOccurs="1" minOccurs="0">
    <xs:complexType>
        <xs:all>
            <xs:element ref="p ?"/> 
        </xs:all>
    </xs:complexType>
</xs:element>

1 ответ

Решение

<xs:element> может быть объявлено на высшем уровне (ниже xs:schema) но это не может иметь minOccurs или же maxOccurs так как это не имеет никакого смысла без контекста. Если это корень, он может иметь только один элемент, если нет, эта информация относится к контексту родительского элемента. Это законно:

<xs:schema ...>
    <xs:element name="parameters">...</xs:element>
    ...
</xs:schema>

но это не так

<xs:schema ...>
    <xs:element name="parameters" maxOccurs="1" minOccurs="0">...</xs:element>
...
</xs:schema>

Вы можете сослаться на верхний уровень xs:element в группе, такой как xs:sequence, Здесь вы можете использовать эти атрибуты, потому что теперь у вас есть контекст (сколько разрешено в этой группе). Это законно:

<xs:schema ...>
    <xs:element name="parent">
        <xs:complexType>
            <xs:sequence>
                 <xs:element ref="parameters" maxOccurs="1" minOccurs="0" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="parameters">
        <xs:complexType>
            <xs:all>
                <xs:element ref="p" minOccurs="0"/> 
            </xs:all>
        </xs:complexType>
    </xs:element>
    ...
</xs:schema>

Вот <parent> это контекст, в котором <parameters> происходит, так что вы можете сказать, сколько раз там разрешено. Определение <parameters> является глобальным, и вы используете ref атрибут для ссылки на него.

Если вам никогда не нужно повторно использовать parameters или если вы никогда не будете иметь parameters как root, он не нужен на верхнем уровне и может быть вложен в ваш parent определение. В этом случае вы можете использовать name приписать с minOccurs а также maxOccurs,

<xs:schema ...>
    <xs:element name="parent">
        <xs:complexType>
            <xs:sequence>
                 <xs:element name="parameters" maxOccurs="1" minOccurs="0" />
                     <xs:complexType>
                          <xs:all>
                               <xs:element ref="p" minOccurs="0"/> 
                          </xs:all>
                     </xs:complexType>
                 </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    ...
</xs:schema>

Вы также можете обратиться к типу верхнего уровня. Более распространено повторное использование, расширение и ограничение типов, так что это также допустимый (и рекомендуемый) способ определения вашего элемента:

<xs:schema ...>
    <xs:element name="parent">
        <xs:complexType>
            <xs:sequence>
                 <xs:element name="parameters" type="ParameterType" maxOccurs="1" minOccurs="0" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="ParameterType">
        <xs:all>
            <xs:element ref="p" minOccurs="0"/> 
        </xs:all>
    </xs:complexType>
    ...
</xs:schema>
Другие вопросы по тегам