DMN 1.2:从另一个 ItemDefinition 引用 ItemDefinitions 导致错误

DMN 1.2: Referencing ItemDefinitions from another ItemDefinition results in an error

我加载此 DMN 文件 (dmnFile):

<definitions name="MyDecision" id="def_12f8a48f-3978-0e29-4251-a66b6e6459bc" 
             xmlns:ns="http://sample.dmn" namespace="http://sample.dmn"
             xmlns:feel="http://www.omg.org/spec/FEEL/20140401" exporter="ex" exporterVersion="12"
             xmlns="http://www.omg.org/spec/DMN/20180521/MODEL/">
  <itemDefinition name="MyItemDefinition" id="_850f24d9-57a3-131f-2194-ca15bb049a7a">
    <itemComponent name="myNumber" id="_29d92e98-3c97-67a3-22f1-d342622424f7">
      <typeRef>NumberDefinition</typeRef>
    </itemComponent>
  </itemDefinition>
  <itemDefinition name="NumberDefinition" id="_e6972775-7973-b755-8714-9eff9d61e48e">
    <typeRef>number</typeRef>
  </itemDefinition>
  <inputData name="MyInput" id="_d6395e05-d35c-d667-f227-398d93a97759">
    <variable name="MyInput" id="_121ab3bc-b4e2-a6bb-51be-ef8fcc6623a6" typeRef="MyItemDefinition" />
  </inputData>
  <decision name="MyDecision" id="_12f8a48f-3978-0e29-4251-a66b6e6459bc">
    <variable name="MyDecision" id="_098e9619-fa0c-3796-b3da-c4d018a79009" typeRef="boolean" />
    <informationRequirement>
      <requiredInput href="#_d6395e05-d35c-d667-f227-398d93a97759" />
    </informationRequirement>
    <context id="_6dcdac84-b03f-badd-a2d7-78c668ece883">
      <contextEntry>
        <variable name="containsMyNumber" id="_f6078cbe-54e6-d682-b3b7-8ffc638e4846" typeRef="boolean" />
        <literalExpression id="_a022013e-4f0c-cfb3-1792-673a9e69be33">
          <text>if list contains([0,1,2,3], MyInput.myNumber) then true else false</text>
        </literalExpression>
      </contextEntry>
      <contextEntry>
        <literalExpression id="_19c3853c-c63b-a8ac-0608-639ea685f321">
          <text>containsMyNumber</text>
        </literalExpression>
      </contextEntry>
    </context>
  </decision>
</definitions>

像这样:

KieServices ks = KieServices.Factory.get();
KieContainer kieContainer = KieHelper.getKieContainer(ks.newReleaseId("org.kie", "dmn-test-" + UUID.randomUUID(), "1.2"), ks.getResources().newFileSystemResource(dmnFile));

我收到异常并显示以下错误消息:

[消息 [id=1, kieBase=defaultKieBase, level=ERROR, path=C:/Users/AppData/Local/Temp/tmpBA10.tmp.dmn, line=4, column=-1 text=DMN:无法解析节点 'MyItemDefinition' 上的类型引用“{http://www.omg.org/spec/DMN/20180521/MODEL/}NumberDefinition”(资源:C:/Users/AppData/Local/Temp/tmpBA10.tmp.dmn, DMN id: _29d92e98-3c97-67a3-22f1-d342622424f7, 未找到列出的类型定义) ]]

带前缀 ("ns:NumberDefinition") 的类型引用导致以下错误消息:

[消息 [id=1, kieBase=defaultKieBase, level=ERROR, path=C:/Users/AppData/Local/Temp/tmpBA10.tmp.dmn, line=4, column=-1 text=DMN:无法解析节点 'MyItemDefinition' 上的类型引用 '{http://www.omg.org/spec/DMN/20180521/MODEL/}ns:NumberDefinition'(资源:C:/Users/AppData/Local/Temp/tmpBA10.tmp.dmn, DMN id: _29d92e98-3c97-67a3-22f1-d342622424f7, 未找到列出的类型定义)]]

我做错了什么?

当使用 DMN 1.1 (xmlns="http://www.omg.org/spec/DMN/20151101/dmn.xsd") 并将引用键入为 QName(带前缀)时,我得到了预期的结果。

从 DMNv1.2 开始,惯用的引用方式是 ns.<itemDef>

在您的原始 DMN xml 文件中,这发生在第 7 行和第 14 行。

总之,惯用的 DMNv1.2 格式的文件应该是:

<definitions name="MyDecision" id="def_12f8a48f-3978-0e29-4251-a66b6e6459bc" 
             xmlns:ns="http://sample.dmn" namespace="http://sample.dmn"
             xmlns:feel="http://www.omg.org/spec/FEEL/20140401" exporter="ex" exporterVersion="12"
             xmlns="http://www.omg.org/spec/DMN/20180521/MODEL/">
  <itemDefinition name="MyItemDefinition" id="_850f24d9-57a3-131f-2194-ca15bb049a7a">
    <itemComponent name="myNumber" id="_29d92e98-3c97-67a3-22f1-d342622424f7">
      <typeRef>ns.NumberDefinition</typeRef>
    </itemComponent>
  </itemDefinition>
  <itemDefinition name="NumberDefinition" id="_e6972775-7973-b755-8714-9eff9d61e48e">
    <typeRef>number</typeRef>
  </itemDefinition>
  <inputData name="MyInput" id="_d6395e05-d35c-d667-f227-398d93a97759">
    <variable name="MyInput" id="_121ab3bc-b4e2-a6bb-51be-ef8fcc6623a6" typeRef="ns.MyItemDefinition" />
  </inputData>
  <decision name="MyDecision" id="_12f8a48f-3978-0e29-4251-a66b6e6459bc">
    <variable name="MyDecision" id="_098e9619-fa0c-3796-b3da-c4d018a79009" typeRef="boolean" />
    <informationRequirement>
      <requiredInput href="#_d6395e05-d35c-d667-f227-398d93a97759" />
    </informationRequirement>
    <context id="_6dcdac84-b03f-badd-a2d7-78c668ece883">
      <contextEntry>
        <variable name="containsMyNumber" id="_f6078cbe-54e6-d682-b3b7-8ffc638e4846" typeRef="boolean" />
        <literalExpression id="_a022013e-4f0c-cfb3-1792-673a9e69be33">
          <text>if list contains([0,1,2,3], MyInput.myNumber) then true else false</text>
        </literalExpression>
      </contextEntry>
      <contextEntry>
        <literalExpression id="_19c3853c-c63b-a8ac-0608-639ea685f321">
          <text>containsMyNumber</text>
        </literalExpression>
      </contextEntry>
    </context>
  </decision>
</definitions>

就是说,根据您的报告,我们在 DMN xml 文件使用 DMN 命名空间作为默认命名空间时发现了一个错误,我们正在解决这个问题 DROOLS-4797.

感谢您的举报!

有一种方法可以避免被迫使用ns.<itemDef>而只需使用<itemDef>,那就是将DMN中的默认命名空间xml设置为模型的命名空间, 并且只是在 DMN xml 元素前加上针对 DMN 命名空间的命名空间前缀。

换句话说,该文件可以使用 <itemDef> 引用,而不必为它们添加 ns. 前缀:

<semantic:definitions name="MyDecision" id="def_12f8a48f-3978-0e29-4251-a66b6e6459bc" 
             xmlns="http://sample.dmn" namespace="http://sample.dmn"
             xmlns:feel="http://www.omg.org/spec/FEEL/20140401" exporter="ex" exporterVersion="12"
             xmlns:semantic="http://www.omg.org/spec/DMN/20180521/MODEL/">
  <semantic:itemDefinition name="MyItemDefinition" id="_850f24d9-57a3-131f-2194-ca15bb049a7a">
    <semantic:itemComponent name="myNumber" id="_29d92e98-3c97-67a3-22f1-d342622424f7">
      <semantic:typeRef>NumberDefinition</semantic:typeRef>
    </semantic:itemComponent>
  </semantic:itemDefinition>
  <semantic:itemDefinition name="NumberDefinition" id="_e6972775-7973-b755-8714-9eff9d61e48e">
    <semantic:typeRef>number</semantic:typeRef>
  </semantic:itemDefinition>
  <semantic:inputData name="MyInput" id="_d6395e05-d35c-d667-f227-398d93a97759">
    <semantic:variable name="MyInput" id="_121ab3bc-b4e2-a6bb-51be-ef8fcc6623a6" typeRef="MyItemDefinition" />
  </semantic:inputData>
  <semantic:decision name="MyDecision" id="_12f8a48f-3978-0e29-4251-a66b6e6459bc">
    <semantic:variable name="MyDecision" id="_098e9619-fa0c-3796-b3da-c4d018a79009" typeRef="boolean" />
    <semantic:informationRequirement>
      <semantic:requiredInput href="#_d6395e05-d35c-d667-f227-398d93a97759" />
    </semantic:informationRequirement>
    <semantic:context id="_6dcdac84-b03f-badd-a2d7-78c668ece883">
      <semantic:contextEntry>
        <semantic:variable name="containsMyNumber" id="_f6078cbe-54e6-d682-b3b7-8ffc638e4846" typeRef="boolean" />
        <semantic:literalExpression id="_a022013e-4f0c-cfb3-1792-673a9e69be33">
          <semantic:text>if list contains([0,1,2,3], MyInput.myNumber) then true else false</semantic:text>
        </semantic:literalExpression>
      </semantic:contextEntry>
      <semantic:contextEntry>
        <semantic:literalExpression id="_19c3853c-c63b-a8ac-0608-639ea685f321">
          <semantic:text>containsMyNumber</semantic:text>
        </semantic:literalExpression>
      </semantic:contextEntry>
    </semantic:context>
  </semantic:decision>
</semantic:definitions>

在这个其他变体中,xml 中的默认命名空间是 DMN 模型的命名空间,因此任何 itemDef 引用都不需要任何前缀。

因为 xml 中的默认命名空间是 DMN 模型的命名空间,所以 xml 元素需要使用现在针对 DMN 命名空间的命名空间前缀作为前缀。

希望这能澄清并提供有见地的解释!