XSD和“最大值”基于上下文

时间:2012-02-17 12:27:34

标签: xml validation xsd

<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属性设置max发生限制,这样如果MyObject直接包含在Container中,它应该只发生一次,但如果MyObject包含在Contained中,它可能会发生多次?

基于similar question,我倾向于认为这不可能,但我想确定。

2 个答案:

答案 0 :(得分:1)

简短的回答是否定的,使用XSD 1.0无法做到。如果您可以向上移动版本或添加到Schematron混合断言,那么您可以。或者,如果纯XSD 1.0是唯一的答案,那么我会尝试找到一种改造的方法; @ penartur可以让你知道从哪里开始(我会通过扩展重用,确保在内容模型的末尾建模“差异”,以允许扩展工作它的魔力)。

答案 1 :(得分:0)

从您的代码来看,似乎逻辑上,Container/MyObjectContainer/Contained/MyObject是不同的类型,尽管它们的名称。

所以我在XSD中为这些声明了两种不同的类型。一个用于Container/MyObject maxOccurs="1",另一个用于Contained/MyObject maxOccurs="whateverYouWant"