OpenAPI的oneOf属性对应的WSDL等效实现方式是什么?
WSDL的类型定义依赖XML Schema(XSD)语法,要实现OpenAPI中oneOf的“校验值恰好符合其中一个子模式”的约束,使用XSD的<xs:choice>元素即可,两者语义完全匹配。
对应示例的正确实现
你给出的OpenAPI示例中,Fruit类型包含公共属性color,同时需要恰好匹配apple和banana两个子模式中的一个,等效的WSDL/XSD写法如下:
<xs:complexType name="Fruit"> <xs:sequence> <!-- 公共属性,所有子模式共享 --> <xs:element name="color" type="xs:string" /> <!-- choice节点对应oneOf逻辑,子元素恰好出现一个 --> <xs:choice> <xs:element name="apple" type="schemas:apple" /> <xs:element name="banana" type="schemas:banana" /> </xs:choice> </xs:sequence> </xs:complexType>
如果你希望采用平铺属性的结构(不嵌套apple/banana对象,直接出现kind或count属性),可以写成:
<xs:complexType name="Fruit"> <xs:sequence> <xs:element name="color" type="xs:string" /> <xs:choice> <xs:element name="kind" type="xs:string" /> <xs:element name="count" type="xs:double" /> </xs:choice> </xs:sequence> </xs:complexType>
校验规则说明
<xs:choice>默认要求其包含的所有子选项中,恰好只能出现一个:
- 不允许同时出现多个子选项,匹配oneOf“符合多个子模式则判定无效”的规则
- 不允许所有子选项都不出现,匹配oneOf“必须符合其中一个子模式”的规则
如果你的业务场景允许不匹配任何子模式(等效于OpenAPI中oneOf所在节点设置nullable: true),可以给<xs:choice>添加minOccurs="0"属性即可。
你之前写法的问题
你之前尝试的两种写法都使用<xs:sequence>罗列所有可选字段并设置minOccurs="0",这种结构允许同时出现多个可选字段、也允许所有可选字段都不出现,自然无法实现oneOf的排他性约束。
内容的提问来源于stack exchange,提问作者JohnBenjamin
相关产品推荐
相关产品推荐

