如何将含自定义类型与引用的XSD Schema转换为原子形式?
问题解答
一、将XSD Schema展开为无自定义类型引用的等效形式的方法
要把包含大量自定义类型的XSD转换成完全展开、无类型引用的等效Schema,有两种简便途径:
- 用XSLT脚本批量处理:编写专门的XSLT样式表,遍历Schema中的所有类型引用(比如
type="STRING_MAX_200"这类),递归查找对应的全局类型定义,将其替换到引用的位置,同时移除原有的全局类型声明。这种方式适合需要批量处理多个Schema的场景。 - 借助XML工具/IDE的内置功能:像Oxygen XML Editor、Altova XMLSpy这类专业工具,都自带“展开Schema类型”的功能,直接导入原Schema就能一键生成完全展开的版本;也可以用Saxon这类命令行工具,通过指定参数完成类型展开。
注意:如果Schema里存在循环引用的自定义类型(比如类型A引用类型B,类型B又引用类型A),这种展开操作会失败,因为无法递归解析循环依赖,但这类情况在业务Schema里很少见。
示例转换
原Schema:
<xs:schema> <xs:simpleType name="STRING_MAX_200"> <xs:restriction base="xs:string"> <xs:maxLength value="200"/> </xs:restriction> </xs:simpleType> <xs:complexType name="NAME_TYPE"> <xs:sequence> <xs:element name="firstName" type="STRING_MAX_200"/> <xs:element name="middleName" type="STRING_MAX_200" minOccurs="0"/> </xs:sequence> </xs:complexType> <xs:element name="signature" type="NAME_TYPE"/> </xs:schema>
转换后展开的Schema:
<xs:schema> <xs:element name="signature"> <xs:sequence> <xs:element name="firstName"> <xs:restriction base="xs:string"> <xs:maxLength value="200"/> </xs:restriction> </xs:element> <xs:element name="middleName" minOccurs="0"> <xs:restriction base="xs:string"> <xs:maxLength value="200"/> </xs:restriction> </xs:element> </xs:sequence> </xs:element> </xs:schema>
二、XML Schema校验的底层执行逻辑
XML基于Schema校验时,底层不会生成完全展开的Schema文件,但会做类似的解析操作:
- 校验器(比如Xerces、Saxon)会先加载并解析Schema,在内存中构建一个包含所有类型约束的“元数据模型”——把所有自定义类型的定义与引用关联起来,相当于在内存中完成了类型的“展开”,但不会输出成物理文件。
- 校验XML时,校验器直接使用这个内存中的模型来检查XML的结构、数据是否符合约束,并且会缓存解析后的模型,避免重复解析以提升效率。
内容的提问来源于stack exchange,提问作者yumba
相关产品推荐
相关产品推荐

