XSD即XML Schema Definition,是用于定义XML文档结构和约束的语言,在XML数据校验场景中应用广泛。基础的XSD约束仅能针对单个元素或属性的取值范围、数据类型做限制,当业务规则涉及多个字段的关联判断时,就需要借助xs:assert来实现跨字段验证。

xs:assert基本语法说明
xs:assert是XSD 1.1版本新增的断言元素,它的核心是通过test属性配置XPath 2.0表达式,当XML实例中对应节点的数据满足表达式时校验通过,否则抛出校验错误。xs:assert可以放置在复杂类型定义内部,作用范围是当前复杂类型的所有子元素和属性。
基本的使用结构如下:
<xs:complexType name="userInfo">
<xs:sequence>
<xs:element name="age" type="xs:integer"/>
<xs:element name="hasChild" type="xs:boolean"/>
<xs:element name="childCount" type="xs:integer"/>
</xs:sequence>
<xs:assert test="逻辑表达式"/>
</xs:complexType>
跨字段验证场景示例
场景1:字段取值联动校验
假设业务规则为:当用户年龄小于18岁时,不允许有子女,即hasChild必须为false,childCount必须为0。这个规则需要同时判断age、hasChild、childCount三个字段的取值,使用xs:assert的实现方式如下:
<xs:element name="user" type="userInfo"/>
<xs:complexType name="userInfo">
<xs:sequence>
<xs:element name="age" type="xs:integer"/>
<xs:element name="hasChild" type="xs:boolean"/>
<xs:element name="childCount" type="xs:integer"/>
</xs:sequence>
<xs:assert test="
if (age < 18) then
(hasChild = false() and childCount = 0)
else
true()
"/>
</xs:complexType>
对应的合法XML实例如下:
<user>
<age>16</age>
<hasChild>false</hasChild>
<childCount>0</childCount>
</user>
如果XML实例中age为16,但hasChild为true,校验时就会触发断言失败,提示不符合约束规则。
场景2:字段取值依赖校验
另一个常见场景是字段取值存在依赖关系,比如订单信息中,当支付方式为在线支付时,支付金额必须大于0,且支付状态不能为空。对应的XSD定义如下:
<xs:element name="order" type="orderInfo"/>
<xs:complexType name="orderInfo">
<xs:sequence>
<xs:element name="payType">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="online"/>
<xs:enumeration value="cash"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="payAmount" type="xs:decimal"/>
<xs:element name="payStatus" type="xs:string"/>
</xs:sequence>
<xs:assert test="
if (payType = 'online') then
(payAmount > 0 and string-length(payStatus) > 0)
else
true()
"/>
</xs:complexType>
使用注意事项
- xs:assert是XSD 1.1的特性,使用时需要确保XML解析器支持XSD 1.1版本,部分旧的解析器仅支持XSD 1.0会无法识别该元素。
- test属性中的XPath表达式需要符合XPath 2.0的语法规范,不能使用XPath 1.0的特有函数,否则会抛出语法错误。
- 断言表达式尽量保持简洁,过于复杂的表达式会增加校验的性能开销,同时也不利于后续维护。
- 如果同一个复杂类型中定义多个xs:assert,所有断言都会被执行,只要有一个断言不满足,整个校验就会失败。
XSDxs:assert跨字段验证XML_Schema修改时间:2026-06-19 06:06:12