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>