Schematron 是基于 XPath 的 XML 语义验证语言,与 XSD 互补:XSD 管结构,Schematron 管逻辑规则,支持跨元素约束、条件依赖、跨文档校验和业务计算等 XSD 难以实现的场景。

Schematron 是一种基于规则的 XML 验证语言,它不定义结构,而是用 XPath 表达式断言“文档应该满足什么条件”。它不是 XSD 的替代品,而是互补工具——XSD 管“长什么样”,Schematron 管“合不合逻辑”。
它为什么比 XSD 更灵活
XSD 擅长描述元素嵌套、出现次数、数据类型和枚举值,但对以下情况无能为力:
- 跨元素约束(比如“如果 status 是 shipped,则 shippingDate 必须存在且早于 today”)
- 条件性依赖(比如“当 country = 'CN' 时,idCardNo 必须匹配身份证正则”)
- 跨文档引用校验(比如“refId 的值必须在另一份 XML 文件的 item/@id 中存在”)
- 业务语义规则(比如“订单总金额 = 所有 item 的 price × quantity 之和”)
怎么写一个 Schematron 规则
规则写在 XML 文件里,核心是
注意:这里不用像 XSD 那样提前声明类型或枚举列表,直接用 XPath 写判断逻辑,改起来快,读起来也直白。
怎么跟 XSD 一起用
典型做法是“先用 XSD 做基础结构验证,再用 Schematron 做语义增强”:
- 用 XSD 保证 book 元素存在、@value 是字符串、不为空
- 用 Schematron 进一步限定该字符串只能取两个特定值,或与其他字段联动判断
- 验证时可串联执行:先跑 XSD 验证器(如 Xerces),再跑 Schematron 处理器(如 libxml2 + schematron.xsl 或 Jing)
适用场景提醒
Schematron 不适合做:
- 纯结构定义(比如“chapter 下必须有且仅有一个 title”——XSD 的 minOccurs="1" maxOccurs="1" 更直接)
- 复杂数据类型推导(比如小数精度、日期范围约束——XSD 的 facets 更标准)
- 需要强工具链集成的工业级元模型(如 UML-to-XML 映射)
基本上就这些。它不复杂但容易忽略——很多人卡在“以为要二选一”,其实 XSD + Schematron == 爽。










