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节点中,导致文档模板无法识别独立条目,只能将其作为整体处理。
修复步骤
- 重构XML结构:为每个ElementType B元素创建独立的子节点,而非拼接字符串
- 调整脚本逻辑:遍历Connection type X关联时,直接生成独立的XML节点
- 适配文档模板:修改表格模板,遍历子节点生成独立行,并基于元素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
相关产品推荐
相关产品推荐

