DMN决策模型XML是严格遵循OMG规范、可被引擎直接执行的可执行定义,根节点必须为并声明正确命名空间,含至少一个、和,FEEL表达式需语法正确且大小写敏感。

DMN 决策模型的 XML 是一个结构清晰、严格遵循 OMG 规范的 XML 文档,后缀通常为 .dmn。它不是随便写的配置文件,而是可被引擎(如 Camunda、Flowable、Drools)直接解析执行的可执行决策定义。
根节点 是唯一入口
所有合法 DMN XML 必须以 为根,且必须声明正确的命名空间(不同版本略有差异):
temperature <= 20 "Soup" > 20 "Salad"
-
xmlns必须匹配你用的 DMN 版本(如20151130、20191111),否则引擎会拒载或报namespace not supported -
id和name都要设:前者是部署 key(Camunda 中用于decisionService.evaluateDecisionByKey("dish")),后者是业务可读名 -
namespace不是 URL,只是命名空间标识符,但必须全局唯一,避免跨项目冲突
的结构不能少三要素
一个可用的决策表必须包含:
- 至少一个
(带) - 至少一个
- 至少一个
(含和)
常见错误:
- 忘写
typeRef(如typeRef="number"),导致 FEEL 表达式解析失败,报cannot coerce string to number -
里写—— 错!这里只允许变量引用(如temperature > 20 temperature),条件逻辑写在里 -
中字符串没加双引号("Soup"),FEEL 会当成未定义变量,报unknown variable 'Soup'
FEEL 表达式必须符合语法,且大小写敏感
DMN 默认使用 FEEL(Friendly Enough Expression Language),不是 JavaScript,也不是 SpEL:
技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作
- ✅ 正确:
、"Hot" temperature > 30 and location = "Beijing" - ❌ 错误:
(用了 JS 语法)temperature > 30 && location == "Beijing" - ❌ 错误:
(变量名大小写不匹配流程传入的TEMPERATURE > 30 temperature)
FEEL 支持:
- 基本运算:
+ - * / - 比较:
> (注意是=,不是==) - 字符串:
"abc",拼接用+("Hello" + " " + name) - 列表:
[1,2,3],取值用方括号:list[1]
部署前务必验证 XML 是否符合 XSD
DMN 引擎加载时会校验 XML 结构。如果你手写或拼接生成 XML,最容易漏的是:
- 忘闭合标签(如
没配) - 属性值没加引号(
typeRef=number→ 必须是typeRef="number") - 使用了高版本才支持的元素(如
在 DMN 1.1 不可用,只在 1.3+ 支持)
建议做法:
- 用官方校验工具:Camunda Modeler 或 Flowable Modeler 导出时自动校验
- 手动校验:用 IDE(如 IntelliJ)绑定 DMN XSD(如
https://www.php.cn/link/7a9693015c73ae1d46ea1e8fd0c7a1fb),实时标红 - 运行时报错典型提示:
cvc-complex-type.2.4.a: Invalid content was found starting with element 'input'. One of '{input}' is expected.→ 说明标签顺序错了(DMN 要求input必须在output前)
真正容易被忽略的点是:XML 命名空间和 XSD 版本必须完全一致——哪怕只差一个字符,引擎就拒绝加载,且错误信息极其模糊。









