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

EA单元素操作表格模板:如何为每个关联元素单独创建超链接?

EA文档模板生成问题

我正基于建模图设计一款可生成文档的EA模板,规则如下:

  • 每个System对应一个章节
  • 每个ElementType C生成对应的子章节

当前实现逻辑:使用指定文档模板和表格模板,通过脚本遍历ElementType C元素,检查Connection type Y关联关系,将符合条件的ElementType B元素ID加入XML结构。

核心问题:表格下半部分的ElementType B元素被视为一个整体,无法单独为每个条目创建超链接,调整XML结构后问题仍未解决。


当前使用的脚本代码

function arrange_data_in_xml(objectid) {
    //Get the repository type
    var repotype = Repository.RepositoryType();
    //Create the xml structure
    var xmlDOM = new COMObject("MSXML2.DOMDocument.6.0");
    xmlDOM.validateOnParse = false;
    xmlDOM.async = false;
    var node = xmlDOM.createProcessingInstruction("xml", "version='1.0' encoding='ISO-8859-1'");
    xmlDOM.appendChild(node);
    var xmlRoot = xmlDOM.createElement("EADATA");
    xmlDOM.appendChild(xmlRoot);
    var xmlDataSet = xmlDOM.createElement("Dataset_0");
    xmlRoot.appendChild(xmlDataSet);
    var xmlData = xmlDOM.createElement("Data");
    xmlDataSet.appendChild(xmlData);

    var part1A = Repository.GetElementSet(sqlquery, 2);
    //This cycle will iterate over each Element Type B
 
    for (var i = 0; i < part1A.Count; i++) {
        var ElementTypeBrow = ""
        var countElementTypeB = 0;
        Session.Output("DEBUG 0 " + part1A.GetAt(i).ElementID + " -- " + part1A.GetAt(i).Name + " -- " + objectid)
        
        var xmlRow = xmlDOM.createElement("Row");
        xmlData.appendChild(xmlRow);
                
        var xmlName = xmlDOM.createElement("Object_ID");
        xmlName.text = part1A.GetAt(i).ElementID;
        xmlRow.appendChild(xmlName);
                
        var xmlName = xmlDOM.createElement("ElementTypeCName");
        xmlName.text = part1A.GetAt(i).Name;
        xmlRow.appendChild(xmlName);
        
        for (var k = 0; k < part1A.GetAt(i).TaggedValues.Count; k++) {
            var tv = part1A.GetAt(i).TaggedValues.GetAt(k);     
            if (tv.Name == 'Proprety X') {
                var xmlName = xmlDOM.createElement("ElementTypeC.TagValue1");
                xmlName.text = tv.Value;
                xmlRow.appendChild(xmlName);
            } else if (tv.Name == 'Proprety Y') {
                var xmlName = xmlDOM.createElement("ElementTypeC.TagValue2");
                xmlName.text = tv.Value;
                xmlRow.appendChild(xmlName);
            }
        }
        for (var j = 0; j < part1A.GetAt(i).Connectors.Count; j++) {
            var connector = part1A.GetAt(i).Connectors.GetAt(j);        
            if (connector.Stereotype == 'Connection type Z') {
                var xmlName = xmlDOM.createElement("ElementTypeC.TagValue3");
                xmlName.text = Repository.GetElementByID(connector.SupplierID).Name;
                xmlRow.appendChild(xmlName);
            } else if (connector.Stereotype == 'Connection type Y') {
                var xmlName = xmlDOM.createElement("ElementTypeC.TagValue4");
                xmlName.text = Repository.GetElementByID(connector.ClientID).Name;
                xmlRow.appendChild(xmlName);
            } else if (connector.Stereotype == 'Connection type X'') {
                var ElementTypeB = Repository.GetElementByID(connector.SupplierID)
                //Check if the ElementTypeB is connected to the current interface           
                if (check_interface(ElementTypeB.ElementID) == objectid) {
                    //Session.Output("DEBUG 1 " + part1A.GetAt(i).Name + " - " + ElementTypeB.Name)
                    var ElementTypeBalias = ""
                    if (ElementTypeB.Alias != "") {ElementTypeBalias = " (" + ElementTypeB.Alias + ")"}
                    ElementTypeBrow = ElementTypeB.Name + ElementTypeBalias + " \n" + ElementTypeBrow
                    countElementTypeB = countElementTypeB + 1           
                }
            }
        }       

        //Session.Output("DEBUG 1 " +ElementTypeBrow + " - " + countElementTypeBs + " - " + ElementTypeB.Name)
        var xmlName = xmlDOM.createElement("ApplicableElementTypeB-Hyperlink");
        if (countElementTypeBs > 1) {
            xmlName.text = ElementTypeBrow.trimStart();
        } else {
            xmlName.text = ElementTypeB.ElementGUID+ElementTypeBrow;            
        }
        xmlRow.appendChild(xmlName);
    
        }
        
    return xmlDOM.xml;
}

问题根源及修复方案

问题本质

当前脚本把所有符合条件的ElementType B元素拼接成单个字符串ElementTypeBrow,并塞进同一个XML节点中,导致文档模板无法识别独立条目,只能将其作为整体处理。

修复步骤

  1. 重构XML结构:为每个ElementType B元素创建独立的子节点,而非拼接字符串
  2. 调整脚本逻辑:遍历Connection type X关联时,直接生成独立的XML节点
  3. 适配文档模板:修改表格模板,遍历子节点生成独立行,并基于元素GUID创建超链接

修改后的脚本代码

function arrange_data_in_xml(objectid) {
    // 获取仓库类型
    var repotype = Repository.RepositoryType();
    // 创建XML结构
    var xmlDOM = new COMObject("MSXML2.DOMDocument.6.0");
    xmlDOM.validateOnParse = false;
    xmlDOM.async = false;
    var node = xmlDOM.createProcessingInstruction("xml", "version='1.0' encoding='ISO-8859-1'");
    xmlDOM.appendChild(node);
    var xmlRoot = xmlDOM.createElement("EADATA");
    xmlDOM.appendChild(xmlRoot);
    var xmlDataSet = xmlDOM.createElement("Dataset_0");
    xmlRoot.appendChild(xmlDataSet);
    var xmlData = xmlDOM.createElement("Data");
    xmlDataSet.appendChild(xmlData);

    var part1A = Repository.GetElementSet(sqlquery, 2);
    // 遍历每个ElementType C元素
    for (var i = 0; i < part1A.Count; i++) {
        var countElementTypeB = 0;
        Session.Output("DEBUG 0 " + part1A.GetAt(i).ElementID + " -- " + part1A.GetAt(i).Name + " -- " + objectid);
        
        var xmlRow = xmlDOM.createElement("Row");
        xmlData.appendChild(xmlRow);
                
        var xmlName = xmlDOM.createElement("Object_ID");
        xmlName.text = part1A.GetAt(i).ElementID;
        xmlRow.appendChild(xmlName);
                
        var xmlName = xmlDOM.createElement("ElementTypeCName");
        xmlName.text = part1A.GetAt(i).Name;
        xmlRow.appendChild(xmlName);
        
        // 处理TaggedValues(修正拼写错误Proprety -> Property)
        for (var k = 0; k < part1A.GetAt(i).TaggedValues.Count; k++) {
            var tv = part1A.GetAt(i).TaggedValues.GetAt(k);     
            if (tv.Name == 'Property X') {
                var xmlName = xmlDOM.createElement("ElementTypeC.TagValue1");
                xmlName.text = tv.Value;
                xmlRow.appendChild(xmlName);
            } else if (tv.Name == 'Property Y') {
                var xmlName = xmlDOM.createElement("ElementTypeC.TagValue2");
                xmlName.text = tv.Value;
                xmlRow.appendChild(xmlName);
            }
        }

        // 创建ElementTypeB的容器节点,用于容纳多个独立条目
        var xmlElementTypeBContainer = xmlDOM.createElement("ApplicableElementTypeBs");
        xmlRow.appendChild(xmlElementTypeBContainer);

        // 处理Connectors(修正Connection type X的单引号错误)
        for (var j = 0; j < part1A.GetAt(i).Connectors.Count; j++) {
            var connector = part1A.GetAt(i).Connectors.GetAt(j);        
            if (connector.Stereotype == 'Connection type Z') {
                var xmlName = xmlDOM.createElement("ElementTypeC.TagValue3");
                xmlName.text = Repository.GetElementByID(connector.SupplierID).Name;
                xmlRow.appendChild(xmlName);
            } else if (connector.Stereotype == 'Connection type Y') {
                var xmlName = xmlDOM.createElement("ElementTypeC.TagValue4");
                xmlName.text = Repository.GetElementByID(connector.ClientID).Name;
                xmlRow.appendChild(xmlName);
            } else if (connector.Stereotype == 'Connection type X') {
                var ElementTypeB = Repository.GetElementByID(connector.SupplierID);
                // 检查ElementTypeB是否关联当前接口
                if (check_interface(ElementTypeB.ElementID) == objectid) {
                    countElementTypeB += 1;           
                    // 为每个ElementTypeB创建独立节点
                    var xmlElementTypeBItem = xmlDOM.createElement("ApplicableElementTypeB");
                    xmlElementTypeBContainer.appendChild(xmlElementTypeBItem);

                    // 添加元素GUID,用于生成超链接
                    var xmlGUID = xmlDOM.createElement("ElementTypeB_GUID");
                    xmlGUID.text = ElementTypeB.ElementGUID;
                    xmlElementTypeBItem.appendChild(xmlGUID);

                    // 添加元素名称(含别名)
                    var ElementTypeBalias = "";
                    if (ElementTypeB.Alias != "") {
                        ElementTypeBalias = " (" + ElementTypeB.Alias + ")";
                    }
                    var xmlNameNode = xmlDOM.createElement("ElementTypeB_Name");
                    xmlNameNode.text = ElementTypeB.Name + ElementTypeBalias;
                    xmlElementTypeBItem.appendChild(xmlNameNode);
                }
            }
        }       
    }
    return xmlDOM.xml;
}

模板适配说明

修改文档模板时,需要遍历ApplicableElementTypeBs节点下的所有ApplicableElementTypeB子节点,为每个节点单独生成表格行,并使用ElementTypeB_GUID字段创建指向EA元素的超链接。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:30:41