xml - XSD 允许同一元素同时包含 simpleType 和 complexType 内容吗?

标签 xml xsd xsd-validation xml-validation

我有一种情况,我有不同的 XML,这些 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 但它似乎效果不佳,或者我对如何在这种情况下实现选择没有清楚的了解。

最佳答案

在 XSD 中,您不能同时允许简单内容和复杂内容,除非您愿意通过 mixed="true" 混合元素和文本(在这种情况下不需要示例 1)。您可以然后使用 XSD 1.1 断言来排除两者同时出现。

<xs:element name="HEADER">
<xs:complexType mixed="true">
  <xs:sequence>
    <xs:element minOccurs="0" 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>

然而,你在这里逆流而上。相反,接受您确实有两个不同的实体和两个不同的内容模型,并以不同的方式命名不同的实体:想到 SIMPLE_HEADERCOMPLEX_HEADER。然后可以在Details上使用xs:choice/maxOccurs="unbounded",让简单和复杂的header可以自由穿插。

关于xml - XSD 允许同一元素同时包含 simpleType 和 complexType 内容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39751548/

相关文章:

java - xml节点的文本值到java

java - 如何使用 Java 根据 wml.xsd 验证 Word 2007 文件?

java - weblogic 11g 和 weblogic 12c 上的 jax-ws 日期时间解析差异

xml - 允许随机排序的 XSD 架构

java - XSD 在验证 xsd 期间忽略命名空间并导入

java - 使 EditText 无需后期验证即可接受一系列值

java - 如何使用 Java 解析 XML?

c - 使用 C 从 XML 文件读取数据

c# - 亚马逊 MWS C# XSD 类生成

xsd - 将模式添加到 xsd 中的 anyURI 数据类型