xsd:any + 选择里面的其他元素

xsd:any + other elements inside choice

我怎样才能实现这样的目标:

<xs:element name="getSubjectProductsResponse">
   <xs:complexType>
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="Products">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="Date" type="xs:date"/>
                        <xs:element name="Branch" type="xs:date" minOccurs="0"/>
                        <xs:element name="State" type="xs:string">

                        <xs:element name="ProductDetail">
                          <xs:complexType>
                             **<xs:choice>
                                  <xs:element name="Account" type="ns:TAccount"/>
                                  <xs:element name="KK" type="ns:TCreditCard"/>
                                  <xs:any/>
                             </xs:choice>**
                          </xs:complexType>
                       </xs:element>

此架构无效。

它是产品列表服务响应消息结构的一部分。 对于响应消息中的每个产品,都有公共属性(日期、分支...)和特定于特定类型产品的属性(在 ProductDetail 元素中)。这就是使用 "choice" 的原因。 因此,在 ProductDetail 中,应该只有一个产品元素,要么是 KK,要么是 Account。

但将来可能会需要添加其他类型的产品。当这种情况发生时,我不想影响那些对该产品不感兴趣的消费者。我希望他们仍然能够使用新型产品验证消息(无需更改代码)。

简而言之,我试图要求 AccountKK 之一或一个 xs:any 其他元素。

有什么办法,我怎样才能在XSD中实现这个?

XSD 1.1

ProductDetail 的声明将允许 AccountKKxs:any 其他元素:

<xs:element name="ProductDetail">
  <xs:complexType>
    <xs:choice>
      <xs:element name="Account" type="xs:string"/>
      <xs:element name="KK" type="xs:string"/>
      <xs:any/>
    </xs:choice>
  </xs:complexType>
</xs:element>

备注:

  • 以上解决方案仅适用于 XSD 1.1。您的要求与 XSD 1.0.
  • 下的 Unique Particle Attribution 冲突
  • 默认情况下 xs:anyprocessContents="strict"。看 processContents strict vs lax vs skip for xsd:any processContents.
  • 的各种值的解释