2

是否可以组合xs:allxs:sequence

我有一个带有元素probenode 的xml 结构,它由元素名称、id、url、标签、优先级、statuws_raw、活动组成。以及设备和组的组合。

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

下面的解决方案不起作用,因为不允许对元素使用 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>
4

1 回答 1

7

在 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 的生成器不必担心固定的顺序(并为信息泄漏打开了一个侧通道,这对某些人来说很重要),但也使得模式作为数据提供者和数据之间的合同文档的用处有所降低消费者。

于 2013-01-31T23:15:13.100 回答