You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在M2Doc的m:template中导出Capella含XHTML表格的描述报错如何解决?

问题

在Capella 5.2搭配M2Doc 3.2.1(Capella 6.1搭配M2Doc 3.3.0时问题复现)的环境中,原本可正常生成包含XHTML表格描述的代码如下:

{ m:for fkt | mySystemEngineering.eAllContents(pa::PhysicalFunction) }
{ m:if not fkt.description.trim().equals('') and fkt.description.trim()->size() > 0 }
{ m: fkt.description.trim().fromHTMLBodyString() }
{ m:else }
- 
{ m:endif }
{ m:endfor }

将这段逻辑封装到m:template后生成文档时报错,模板代码如下:

{ m:template showDescriptions(top:capellamodeller::SystemEngineering) }
{ m:for fkt | top.eAllContents(pa::PhysicalFunction) }
{ m:if not fkt.description.trim().equals('') and fkt.description.trim()->size() > 0 }
{ m: fkt.description.trim().fromHTMLBodyString() }
{ m:else }
- 
{ m:endif }
{ m:endfor }
{ m:endtemplate }

{ m:mySystemEngineering.showDescriptions() }

错误信息:

M2Doc : technical error.

org.apache.xmlbeans.impl.values.XmlValueDisconnectedException
    at org.apache.xmlbeans.impl.values.XmlObjectBase.check_orphaned(XmlObjectBase.java:1258)
    at org.openxmlformats.schemas.wordprocessingml.x2006.main.impl.CTPImpl.addNewR(Unknown Source)
    at org.apache.poi.xwpf.usermodel.XWPFParagraph.createRun(XWPFParagraph.java:1414)
    at org.obeonetwork.m2doc.util.M2DocUtils.appendMessageRun(M2DocUtils.java:238)
    at org.obeonetwork.m2doc.generator.M2DocEvaluator.insertBody(M2DocEvaluator.java:716)
    at org.obeonetwork.m2doc.generator.M2DocEvaluator.insertGenerationResult(M2DocEvaluator.java:694)
    at org.obeonetwork.m2doc.generator.M2DocEvaluator.insertObject(M2DocEvaluator.java:670)
    at org.obeonetwork.m2doc.generator.M2DocEvaluator.caseQuery(M2DocEvaluator.java:610)
    at org.obeonetwork.m2doc.generator.M2DocEvaluator.caseQuery(M2DocEvaluator.java:1)
    at org.obeonetwork.m2doc.template.util.TemplateSwitch.doSwitch(TemplateSwitch.java:186)
    at org.eclipse.emf.ecore.util.Switch.doSwitch(Switch.java:53)
    at org.eclipse.emf.ecore.util.Switch.doSwitch(Switch.java:69)
    at org.obeonetwork.m2doc.generator.M2DocEvaluator.doSwitch(M2DocEvaluator.java:1450)
    at org.obeonetwork.m2doc.generator.M2DocEvaluator.caseBlock(M2DocEvaluator.java:1675)
    at org.obeonetwork.m2doc.generator.M2DocEvaluator.caseBlock(M2DocEvaluator.java:1)
    at org.obeonetwork.m2doc.template.util.TemplateSwitch.doSwitch(TemplateSwitch.java:199)
    at org.eclipse.emf.ecore.util.Switch.doSwitch(Switch.java:53)
    at org.eclipse.emf.ecore.util.Switch.doSwitch(Switch.java:69)
    at org.obeonetwork.m2doc.generator.M2DocEvaluator.doSwitch(M2DocEvaluator.java:1450)
    at org.obeonetwork.m2doc.generator.M2DocEvaluator.caseDocumentTemplate(M2DocEvaluator.java:314)
    at org.obeonetwork.m2doc.generator.M2DocEvaluator.caseDocumentTemplate(M2DocEvaluator.java:1)
    at org.obeonetwork.m2doc.template.util.TemplateSwitch.doSwitch(TemplateSwitch.java:279)
    at org.eclipse.emf.ecore.util.Switch.doSwitch(Switch.java:53)
    at org.eclipse.emf.ecore.util.Switch.doSwitch(Switch.java:69)
    at org.obeonetwork.m2doc.generator.M2DocEvaluator.doSwitch(M2DocEvaluator.java:1450)
    at org.obeonetwork.m2doc.generator.M2DocEvaluator.generate(M2DocEvaluator.java:299)
    at org.obeonetwork.m2doc.util.M2DocUtils.generate(M2DocUtils.java:853)
    at org.obeonetwork.m2doc.genconf.GenconfUtils.generate(GenconfUtils.java:507)
    at org.obeonetwork.m2doc.genconf.GenconfUtils.generate(GenconfUtils.java:432)
    at org.obeonetwork.m2doc.genconf.editor.command.GenerateHandler$GenerateJob.runInWorkspace(GenerateHandler.java:87)
    at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:42)
    at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)

解决方案

问题源于模板中直接返回fromHTMLBodyString()的结果时,M2Doc在模板上下文处理HTML内容存在对象连接异常,需做以下修改:

修改方案1:通过变量拼接返回结果

  1. 给模板添加String类型返回值声明
  2. 用变量拼接所有内容,最后通过m:return返回
  3. 调用模板时通过toString()确保内容正确插入

修正后代码:

{ m:template showDescriptions(top:capellamodeller::SystemEngineering):String }
{ m:var result = '' }
{ m:for fkt | top.eAllContents(pa::PhysicalFunction) }
{ m:if not fkt.description.trim().equals('') and fkt.description.trim()->size() > 0 }
{ m:result += fkt.description.trim().fromHTMLBodyString() + '\n' }
{ m:else }
{ m:result += '- \n' }
{ m:endif }
{ m:endfor }
{ m:return result }
{ m:endtemplate }

{ m:mySystemEngineering.showDescriptions().toString() }

修改方案2:使用m:html标签处理内容(推荐)

如果M2Doc版本支持,直接用m:html标签替代fromHTMLBodyString(),避免类型推断问题:

{ m:template showDescriptions(top:capellamodeller::SystemEngineering) }
{ m:for fkt | top.eAllContents(pa::PhysicalFunction) }
{ m:if not fkt.description.trim().equals('') and fkt.description.trim()->size() > 0 }
{ m:html(fkt.description.trim()) }
{ m:else }
- 
{ m:endif }
{ m:newline }
{ m:endfor }
{ m:endtemplate }

{ m:mySystemEngineering.showDescriptions() }

内容的提问来源于stack exchange,提问作者EI12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 07:05:03