xsd:选择中的任何+其他元素

时间:2016-05-27 14:50:23

标签: xml xsd xsd-validation backwards-compatibility xml-validation

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

<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>

此架构无效。

它是产品列表服务响应消息结构的一部分。 对于响应消息中的每个产品,都有公共属性(Date,Branch ...)和特定于特定产品类型的属性(在ProductDetail元素中)。这就是使用&#34;选择&#34;的原因。 因此,在ProductDetail中,应该只有一个产品元素,KK或Account。

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

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

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

1 个答案:

答案 0 :(得分:0)

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>

备注: