2013-07-11 4 views
1

У меня есть простая структура 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> вместо замены, чтобы добиться этого?

ответ

0

XSD 1.0 не позволяет типу одного элемента зависеть от содержимого другого.

Вы можете реализовать такие зависимости в XSD 1.1, используя утверждения.

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

+0

Благодарим за ответ. Однако я не вижу, как существует зависимость от содержимого другого элемента - разве это не вопрос количества допустимых элементов двух разных типов? Возможно, у меня что-то не так на концептуальном уровне, не могли бы вы объяснить немного подробнее? – Henrik

+0

ОК, извините, я должен был прочитать более внимательно. Вы не можете сделать это с помощью групп подстановки: если элементы подставляются друг под друга, то ограничения на появление для обоих должны быть одинаковыми. Вам понадобится явная модель контента с выбором в ней. –

+0

Хорошо, это имеет смысл. Благодарим вас за пересмотр. – Henrik

Смежные вопросы