XSD允许同一元素的simpleType和complexType内容?

时间:2016-09-28 15:19:13

标签: xml xsd xsd-validation xml-validation

我的情况是,我有不同的XML,它们具有不同类型的属性。有时,元素HEADER可能只有一个节点,或者某些XML可能在HEADER节点中包含元素,并且内部有值。

示例1(HEADER只包含文字):

<Details HeaderLabel="DETAILS">
   <HEADER Label="Header">2.5%</HEADER>
</Details>

示例2(HEADER包含两个子元素):

<Details HeaderLabel="DETAILS">
   <HEADER Label="Header">
       <HEAD Label="H1a">2.88%</HEAD>
       <HEAD Label="H2b">3.24%</HEAD>
   </HEADER>
</Details>

XSD的工作原理如下: 这将验证示例1

<xs:element name="HEADER">
   <xs:complexType>
      <xs:simpleContent>
         <xs:extension base="xs:string">
            <xs:attribute name="Label" type="xs:string" use="required" />
          </xs:extension>
       </xs:simpleContent>
    </xs:complexType>
 </xs:element>

这将验证示例2

<xs:element name="HEADER">
   <xs:complexType>
      <xs:sequence>
         <xs:element maxOccurs="unbounded" name="HEAD">
           <xs:complexType>
             <xs:simpleContent>
               <xs:extension base="xs:string">
                 <xs:attribute name="Label" type="xs:string" use="required" />
               </xs:extension>
             </xs:simpleContent>
           </xs:complexType>
         </xs:element>
       </xs:sequence>
     <xs:attribute name="Label" type="xs:string" use="required" />
   </xs:complexType>
 </xs:element>

我尝试使用xs:choice,但似乎效果不好,或者我对在这种情况下如何实施选择没有明确的理解。

2 个答案:

答案 0 :(得分:0)

在XSD中,您不能同时允许简单和复杂的内容,除非您愿意通过mixed="true"添加混合元素和文本。您可以然后使用XSD 1.1断言来排除两者同时出现。

然而,你在这里逆流而行。相反,接受您确实有两个不同的实体和两个不同的内容模型,并以不同的方式命名不同的实体SIMPLE_HEADERCOMPLEX_HEADER会浮现在脑海中。然后,您可以在xs:choice/maxOccurs="unbounded"上使用Details,以允许简单和复杂的标题自由散布。

答案 1 :(得分:0)

如果实例已经存在,并且您无法更改它们,并且您正在尝试编写XSD架构来描述它们,并且它必须是一个描述它们的架构,那么您的选项非常有限。据我所知,唯一的解决方案是使用混合内容定义HEADER - 这是一个糟糕的解决方案。通过使用XSD 1.1断言可以稍微改进一下(尽管不多)。

如果您可以删除任何这些要求(例如,如果您可以更改实例文档,或者您可以使用RelaxNG进行验证,或者您可以为每种文档类型使用不同的模式)那么您有机会一个更令人满意的解决方案。