在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:通过变量拼接返回结果
- 给模板添加
String类型返回值声明 - 用变量拼接所有内容,最后通过
m:return返回 - 调用模板时通过
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
相关产品推荐
相关产品推荐

