【问题标题】:xsd:any + other elements inside choicexsd:any + 选择中的其他元素
【发布时间】:2016-05-27 14:50:22
【问题描述】:

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

<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 元素中)。这就是使用“选择”的原因。 因此,在 ProductDetail 中,应该只有一个产品元素,KK 或 Account。

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

简而言之,我试图要求 AccountKKxs:any 其他元素之一。

有什么方法,我如何在 XSD 中实现这一点?

【问题讨论】:

  • 你的意图不明确。您是否试图要求 AccountKK 之一,然后是 0 个或更多任何其他元素?请准确说明应该和不应该允许什么。谢谢。
  • 抱歉不清楚。但是,是的,你说到点子上了。这正是我想要的。
  • 请记住,&lt;xsd:any/&gt; 完全按照您想要的方式执行(在 XSD 1.0 和 1.1 中):它匹配 Account 元素、KK 元素或任何其他元素元素。

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


【解决方案1】:

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>

注意事项:

【讨论】:

  • 我现在觉得很尴尬,但是因为语言不通,我不太明白你的澄清建议。另外,我意识到任何元素都应该只出现一次。所以我相应地修改了问题陈述。如果您能再次回答我的问题,我将不胜感激。感谢并为您的困惑感到抱歉。
  • 没问题。已更新答案以匹配您的问题更新。
  • 谢谢。所以解决方法是使用更高版本的 XML Schema。此外,似乎在 1.1 版中。不需要顺序。复杂类型中的选择也可以。
  • 你说得对——xsd:sequence 是多余的。固定的。谢谢。
  • 今天,我发现您建议的架构是有效的,但是当这个架构包含在 WSDL 文件中时,会出现验证问题。 Altova 返回以下错误:无效的 XML 模式:'复杂类型定义'{anonymous}'的内容模型不明确。' . 你知道如何解决这个问题吗?谢谢
猜你喜欢
  • 1970-01-01
  • 2013-08-23
  • 1970-01-01
  • 2017-09-19
  • 2013-02-08
  • 1970-01-01
  • 2011-10-27
  • 2012-11-07
  • 1970-01-01
相关资源
最近更新 更多