在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后系统会自动允许。
常见混合内容模式举例
- 最自由的混合(任意子元素任意顺序任意次数 + 文本):
<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>
- 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",不要包在 simpleContent 或 complexContent 里面(除非你真的要扩展或限制基类型,但大多数情况不需要)。
总结
| 需求 | XSD关键写法 |
|---|---|
| 纯文本(无子元素) | <xs:simpleType> 或 <xs:complexType><xs:simpleContent> |
| 只有子元素(无直接文本) | <xs:complexType mixed="false">(默认) |
| 混合内容(文本+子元素) | <xs:complexType mixed="true"> + 子元素模型 |
只要记住:混合内容 = complexType + mixed=”true”,就基本不会出错。
有具体的XML结构想用XSD表达混合内容的话,可以贴出来,我帮你写完整的schema。