如何定义一个模式定义,可以选择一个元素或另一个元素的多个元素

问题描述 投票:0回答:1

我正在尝试为可以有多种格式的类型进行架构定义,但我不太确定如何最好地做到这一点。

我尝试为其创建类型的 XML 块将涵盖如下条目:

<Object>
    <Filter> <!-- 0 or 1 of these -->
       <!-- Filter stuff -->
    </Filter>
    <MapObject> <!-- 1 or more of these
      <!-- Map Object stuff -->
    </MapObject>
</Object>

OR 

<Object>
    <Filter> <!-- 0 or 1 of these -->
       <!-- Filter stuff -->
    </Filter>
    <UpdateObject> <!-- 1 or more of these
      <!-- Update Object stuff -->
    </UpdateObject>
</Object>

我可以选择 xs:sequence,例如:

    <xs:complexType name="ObjectType">
        <xs:sequence>
            <xs:element name="Filter" minOccurs="0" maxOccurs="unbounded" type="FilterType"/>
            <xs:element name="MapObject" minOccurs="0" maxOccurs="unbounded" type="MapObjectType"/>
            <xs:element name="UpdateObject" minOccurs="0" maxOccurs="unbounded" type="UpdateObjectType"/>
        </xs:sequence>
    </xs:complexType>

但是我想确保我至少有 1 个 MapObject 或 UpdateObject,并且我可以允许多个 MapObject(但只能有 1 个 UpdateObject),并且我们不能混合使用 MapObject 和 UpdateObject。

有人对如何在模式定义中最好地定义它有建议吗?

xsd
1个回答
0
投票

如果您可以使用XSD 1.1,则可以使用

assert
逻辑运算符:

它看起来像下面这样:

<xs:complexType name="ObjectType">
  <xs:sequence>
    <!-- Filter 0 or 1 of these -->
    <xs:element name="Filter" minOccurs="0" maxOccurs="1" type="FilterType"/>
    <!-- MapObject : undefined if UpdateObject or 1 min (no max) -->
    <xs:element name="MapObject" minOccurs="0" maxOccurs="unbounded" type="MapObjectType"/>
    <!-- UpdateObject : undefined if MapObject or 1 max -->
    <xs:element name="UpdateObject" minOccurs="0" maxOccurs="1" type="UpdateObjectType"/>
    <xs:assert test="(MapObject and !UpdateObject) or (!MapObject and UpdateObject)"/>
  </xs:sequence>
</xs:complexType>

请参阅文档此处

如果 XSD 1.1 没有问题,您可以在后端服务器中进行这种逻辑检查(这就是我在了解

xs:assert
运算符之前所做的事情)。

类似问题这里

© www.soinside.com 2019 - 2024. All rights reserved.