XSD и «макс происходит» в зависимости от контекста - PullRequest
0 голосов
/ 17 февраля 2012
<Container>
    <MyObject>
        <property1>abcd</property1>
        <property2>
            <Version>3.2</Version>
        </property2>
    </MyObject>

    <Contained>

        <MyObject>
            <property1>something</property1>
            <property2>
                <Version>1.1</Version>
                <Version>1.2</Version>
                <Version>1.6</Version>
            </property2>
        </MyObject>

        <MyObject>
            <property1>something else</property1>
            <property2>
                <Version>2.3</Version>
                <Version>2.5</Version>
                <Version>2.6</Version>
            </property2>
        </MyObject>

    </Contained>
</Container>

Учитывая эту структуру xml, в соответствующем xsd-файле я могу установить ограничение на максимальный размер для свойства Version, чтобы, если MyObject непосредственно содержится в контейнере, это происходило ровно один раз, но если MyObject содержится в Contained, тогда это может произойти любое количество раз?

Исходя из подобного вопроса , я склонен думать, что это невозможно, но я хотел бы быть уверен.

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Короткий ответ - нет, это невозможно сделать с помощью XSD 1.0.Если вы можете продвинуться вверх по версии или добавить в микс утверждения Schematron, то можете.В качестве альтернативы, если чистый XSD 1.0 является единственным ответом, я бы попытался найти способ переделать;@ penartur's может дать вам представление о том, с чего начать (вместо этого я бы использовал повторно по расширению, гарантируя, что «различия» будут смоделированы в конце модели содержимого, чтобы расширение могло работать по волшебству).

0 голосов
/ 17 февраля 2012

Из вашего кода кажется, что логически Container/MyObject и Container/Contained/MyObject - это разные типы, несмотря на их имена.

Так что я объявил два разных типа в XSD для них.Один для Container/MyObject с maxOccurs="1", а другой для Contained/MyObject с maxOccurs="whateverYouWant".

...