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

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









