如何在具有相同元素的2个值的XSD中使用复杂类型中的<choice>?

我想验证2种XML“过滤器”块,它们的“形状”包含2个值之一:“空”或“圆”:

  • 如果为“空”,则块应仅包含“形状”。
  • 如果需要“圆形”,“中心”和“直径”。

XML示例:

<filter>
  <shape>empty</shape>
</filter>

<filter>            
  <shape>circle</shape>
  <center>10.3</center>
  <diameter>5.1</diameter>
<filter>

我已经尝试过这种XSD架构:

<xs:element name="filter">
  <xs:complexType>
    <xs:choice>
      <xs:all>
        <xs:element name="shape" type="xs:string" fixed="circle"/>
        <xs:element name="center" type="xs:decimal"/>
        <xs:element name="diameter" type="xs:decimal"/>
      </xs:all>
      <xs:element name="shape" type="xs:string" fixed="empty"/>
    </xs:choice>
  </xs:complexType>
</xs:element>

未成功... xmllint抱怨:

  

mytest.xsd:160:全部元素:模式解析器错误:元素'{http://www.w3.org/2001/XMLSchema}选择':内容无效。期望是(注释?,(元素|组|选择|序列|任何)*)。

     

WXS模式mytest.xsd编译失败

如果我用xs:sequence替换xs:all,它说:

  

mytest:158:元素complexType:模式解析器错误:本地复杂类型:内容模型不确定。

     

WXS模式mytest.xsd编译失败

如何编写此XSD-如果可能的话?

我知道,如果我的XML使用的是“ shape0”而不是“ empty”的“ shape”:

<filter>
  <shape0>empty</shape0>
</filter>

<filter>            
  <shape>circle</shape>
  <center>10.3</center>
  <diameter>5.1</diameter>
<filter>

它可以通过以下方式验证:

<xs:element name="filter">
  <xs:complexType>
    <xs:choice>
      <xs:sequence>
        <xs:element name="shape" type="xs:string" fixed="circle"/>
        <xs:element name="center" type="xs:decimal"/>
        <xs:element name="diameter" type="xs:decimal"/>
      </xs:sequence>
      <xs:element name="shape0" type="xs:string" fixed="empty"/>
    </xs:choice>
  </xs:complexType>
</xs:element>

但是,不幸的是,我的XML使用相同的关键字...

SSBB999SA 回答:如何在具有相同元素的2个值的XSD中使用复杂类型中的<choice>?

在XSD 1.0中,无法为依赖于内容的结构定义规则。

在XSD 1.1中,您可以使用断言来执行此操作,例如<xs:assert test="not(shape='empty' and (centre or diameter))"/>

本文链接:https://www.f2er.com/2928917.html

大家都在问