Schematron是一种基于规则的XML验证语言,它不同于XML Schema这类侧重结构定义的验证方式,主要通过声明式的规则来检查XML文档的内容是否符合预设的业务逻辑和约束条件,能够覆盖很多结构验证无法触达的校验场景。

Schematron的核心概念
Schematron的核心设计思路是通过规则(Rule)和断言(Assertion)来描述校验逻辑,它的验证过程不依赖固定的结构定义,而是基于XPath表达式对XML文档中的节点进行匹配和判断。
几个核心概念需要提前了解:
- 模式(Pattern):一组相关规则的集合,用于组织不同场景下的校验逻辑,一个Schematron文档可以包含多个模式。
- 规则(Rule):绑定到特定XML节点的校验逻辑容器,通过上下文(context)属性指定规则生效的节点路径。
- 断言(Assertion):规则内部的具体校验条件,通过test属性编写XPath表达式,当表达式返回true时表示校验通过,否则会触发对应的提示信息。
- 报告(Report):和断言逻辑相反,当test表达式返回true时输出提示信息,通常用于输出符合规则的节点信息。
Schematron的基础语法结构
一个标准的Schematron文档遵循固定的XML结构,根元素是<schema>,内部可以包含命名空间声明、模式、规则、断言等元素。下面是一个最简单的Schematron示例,用于校验XML中book节点的price子元素值必须大于0:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron">
<pattern id="price_check">
<rule context="book">
<assert test="price > 0">
书籍价格必须大于0,当前价格为:<value-of select="price"/>
</assert>
</rule>
</pattern>
</schema>
上述代码中,<rule>的context属性指定规则作用于所有book节点,<assert>的test属性使用XPath表达式判断price的值是否大于0,如果不满足就会输出对应的错误提示,<value-of>用于提取当前节点的price值展示在提示信息中。
Schematron和XML Schema的差异
很多开发者会混淆Schematron和XML Schema的用法,两者的核心差异如下:
| 对比维度 | XML Schema | Schematron |
|---|---|---|
| 验证侧重点 | XML文档的结构、数据类型、元素层级关系 | XML文档的内容逻辑、业务规则、节点间的约束关系 |
| 规则描述方式 | 声明式的结构定义,固定语法 | 基于XPath的灵活规则,可自定义复杂逻辑 |
| 适用场景 | 通用的XML结构校验,跨系统数据格式约定 | 特定业务的校验规则,结构验证无法覆盖的逻辑判断 |
| 错误提示灵活性 | 提示信息相对固定,可定制空间小 | 可自定义详细的错误提示,支持动态提取节点内容 |
Schematron的实际应用案例
假设我们有一个订单XML文档,需要校验两个业务规则:一是订单中商品的总价等于单价乘以数量,二是如果订单包含折扣信息,折扣金额不能超过商品总价的50%。对应的Schematron规则可以这样编写:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron">
<pattern id="order_check">
<!-- 校验总价等于单价乘以数量 -->
<rule context="order/item">
<assert test="total_price = unit_price * quantity">
商品总价计算错误,单价:<value-of select="unit_price"/>,数量:<value-of select="quantity"/>,当前总价:<value-of select="total_price"/>
</assert>
</rule>
<!-- 校验折扣不超过总价的50% -->
<rule context="order[discount]">
<assert test="discount <= total * 0.5">
折扣金额不能超过订单总价的50%,当前总价:<value-of select="total"/>,折扣:<value-of select="discount"/>
</assert>
</rule>
</pattern>
</schema>
对应的待校验订单XML示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<order>
<total>150</total>
<discount>80</discount>
<item>
<unit_price>50</unit_price>
<quantity>3</quantity>
<total_price>150</total_price>
</item>
</order>
上述订单中折扣80超过了总价150的50%(75),Schematron验证时会触发第二个规则的断言错误,输出对应的提示信息。
Schematron的使用流程
在实际项目中使用Schematron进行XML验证通常遵循以下流程:
- 根据业务需求编写Schematron规则文件,定义需要校验的所有规则和对应的提示信息。
- 选择Schematron验证工具,常见的有开源的Schematron验证库、支持Schematron的XML编辑器,或者集成到Java、Python等后端项目的验证组件中。
- 将待校验的XML文档和Schematron规则文件传入验证工具,执行验证并获取校验结果。
- 根据校验结果中的错误提示定位XML文档中的问题,调整数据后重新验证。
Schematron的灵活性让它非常适合处理复杂的业务校验场景,尤其是当XML的结构已经通过XML Schema校验通过,但还需要额外验证内容逻辑时,Schematron可以作为很好的补充验证工具。开发者只需要掌握基础的XPath语法,就能快速编写出符合业务需求的校验规则,提升XML数据校验的准确性和灵活性。
SchematronXML验证规则引擎XML_schema修改时间:2026-07-15 09:15:30