У меня есть простая структура XML, которая выглядит следующим образомXSD: Различные MaxOccurs для конкретной замены
...
<param>
<name>foo</name>
<type1>
Some complex content
</type1>
</param>
<param>
<name>bar</name>
<type2>
Some complex content
</type2>
</param>
...
Схема Я использую выглядит следующим образом
...
<xs:complexType name="par">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element ref="typeSpecific"/>
</xs:sequence>
</xs:complexType>
<xs:element name="typeSpecific" abstract="true"/>
<xs:element name="type1" type="t1" substitutionGroup="typeSpecific"/>
<xs:element name="type2" type="t2" substitutionGroup="typeSpecific"/>
...
Я хочу продлить это так, чтобы если я использую type1 в параметре, у меня может быть только один такой элемент, но если я использую type2, у меня может быть много таких:
...
<param>
<name>bar</name>
<type2>
Some complex content
</type2>
...
<type2>
Some other complex content
</type2>
</param>
Я хочу избежать обертывания элементов type2
в контейнере из-за проблем с совместимостью. Мой первый импульс состоял в том, чтобы использовать атрибут maxOccurs="unbounded"
<xs:element name="type2" type="t2" substitutionGroup="typeSpecific" maxOccurs="unbounded"/>
, но это запрещено.
Есть ли способ применить это ограничение с помощью XSD, используя мою текущую структуру? Могу ли я каким-то образом использовать <xs:choice>
вместо замены, чтобы добиться этого?
Благодарим за ответ. Однако я не вижу, как существует зависимость от содержимого другого элемента - разве это не вопрос количества допустимых элементов двух разных типов? Возможно, у меня что-то не так на концептуальном уровне, не могли бы вы объяснить немного подробнее? – Henrik
ОК, извините, я должен был прочитать более внимательно. Вы не можете сделать это с помощью групп подстановки: если элементы подставляются друг под друга, то ограничения на появление для обоих должны быть одинаковыми. Вам понадобится явная модель контента с выбором в ней. –
Хорошо, это имеет смысл. Благодарим вас за пересмотр. – Henrik