XSD 混合内容

在XSD(XML Schema Definition)中,混合内容(Mixed Content)指的是一个元素既可以包含子元素,又可以直接包含文本内容(即元素内容和文本混在一起)。

典型例子就是HTML/XHTML中的段落:

<p>
  这是一段文字,里面有一个<strong>加粗</strong>和一个<em>斜体</em>。
</p>

如何在XSD中声明混合内容?

使用 complexType 并设置 `mixed属性为true:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <!-- 正确的混合内容写法 -->
  <xs:element name="p">
    <xs:complexType mixed="true">
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="strong" type="xs:string"/>
        <xs:element name="em" type="xs:string"/>
        <xs:element name="br" /> <!-- 空元素 -->
      </xs:choice>
    </xs:complexType>
  </xs:element>

</xs:schema>

关键点解释:

  • mixed="true":这是开启混合内容的核心开关。没有这一句,默认只能有子元素或只能有文本,不能混在一起。
  • 子元素模型通常用 <xs:choice><xs:sequence><xs:all> 配合 minOccurs="0" maxOccurs="unbounded" 来允许任意顺序、任意次数出现(因为文本可以出现在任意位置)。
  • 文本内容本身不需要显式声明,开启mixed后系统会自动允许。

常见混合内容模式举例

  1. 最自由的混合(任意子元素任意顺序任意次数 + 文本):
<xs:complexType name="RichTextType" mixed="true">
  <xs:choice minOccurs="0" maxOccurs="unbounded">
    <xs:element name="b" type="RichTextType"/>
    <xs:element name="i" type="RichTextType"/>
    <xs:element name="u" type="RichTextType"/>
    <xs:element name="br"/>
    <!-- 可以继续添加其他内联元素 -->
  </xs:choice>
</xs:complexType>
  1. XHTML 1.0 Strict 中对 元素的简化模拟:
<xs:element name="p">
  <xs:complexType mixed="true">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element ref="br"/>
      <xs:element ref="span"/>
      <xs:element ref="strong"/>
      <xs:element ref="em"/>
      <xs:element ref="a"/>
      <!-- 其他内联元素... -->
    </xs:choice>
  </xs:complexType>
</xs:element>

不能写成这样(常见错误)

<!-- 错误:simpleContent 不能和子元素一起用 -->
<xs:complexType mixed="true">
  <xs:simpleContent>
    <xs:extension base="xs:string"/>
  </xs:simpleContent>
</xs:complexType>

<!-- 错误:用了 complexContent 但没正确处理 -->
<xs:complexContent mixed="true"> <!-- mixed 属性只能直接写在 complexType 上,不能写在 complexContent 上 -->

正确写法是直接在 <xs:complexType> 上写 mixed="true",不要包在 simpleContentcomplexContent 里面(除非你真的要扩展或限制基类型,但大多数情况不需要)。

总结

需求XSD关键写法
纯文本(无子元素)<xs:simpleType><xs:complexType><xs:simpleContent>
只有子元素(无直接文本)<xs:complexType mixed="false">(默认)
混合内容(文本+子元素)<xs:complexType mixed="true"> + 子元素模型

只要记住:混合内容 = complexType + mixed=”true”,就基本不会出错。

有具体的XML结构想用XSD表达混合内容的话,可以贴出来,我帮你写完整的schema。

文章已创建 2838

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部