xml模式maxOccurs =在xs:all中无界限

时间:2013-01-31 09:44:36

标签: xsd

是否可以合并xs:allxs:sequence

我有一个带有元素probenode的xml结构,它由元素name,id,url,tags,priority,statuws_raw,active组成。并且是设备和组合的组合。

设备和组可以出现零次或多次......

下面的解决方案不起作用,因为不允许对元素使用unbounded。在一个团体中。

<xs:complexType name="probenodetype">
    <xs:all>
        <xs:element name="name" type="xs:string" />
        <xs:element name="id" type="xs:unsignedInt" />
        <xs:element name="url" type="xs:string" />
        <xs:element name="tags" />
        <xs:element name="priority" type="xs:unsignedInt" />
        <xs:element name="status_raw" type="xs:unsignedInt" />
        <xs:element name="active" type="xs:boolean" />
        <xs:element name="device" type="devicetype" minOccurs="0" maxOccurs="unbounded">
            <!-- zie devicetype -->
        </xs:element>
        <xs:element name="group" type="grouptype" minOccurs="0" maxOccurs="unbounded">
            <!-- zie grouptype -->
        </xs:element>
    </xs:all>
    <xs:attribute name="noaccess" type="xs:integer" use="optional" />
</xs:complexType>

1 个答案:

答案 0 :(得分:4)

在XSD 1.0中,xs:all的子项必须将maxOccurs设置为1.

在XSD 1.1中解除了这个约束。

所以你的选择似乎是:

  • 使用XSD 1.1处理器(Saxon或Xerces-J)。

  • 使用XSD 1.0并对probenodetype的子项执行命令。如果子项出现的顺序带有信息(因此id后跟url与url后跟id ...),则会出现问题。

在一些简单的情况下,编写一个内容模型是可行的,只使用选择和序列来准确接受您建议的内容,但是如果需要七个元素,则生成的内容模型可能太长且太复杂而无法使用。

此时,一些用户放弃并编写一个带有可重复OR组的复杂类型,并将检查该名称,id,url等的责任移动至少一次,最多一次进入应用程序;这允许XML的生成器不必担心固定的顺序(并打开信息泄漏的辅助通道,这对某些人来说很重要),但也使得模式在数据提供者和数据之间的合同文档中不那么有用消费者。