首先,我将简短地描述我想做的事情:我正在与SysMl建模器一起创建活动图。使用SysML建模器完成模型后,可以从模型中创建XML文件。该XML文件应导入到其他工具中。但是,为了更好地理解源XML代码,我想对其进行转换。在以下XML代码中,您可以看到'edge'节点。每个“边缘”节点均指“目标”和“源”。但是,如果您对代码的了解不多,就无法读出“源”和“目标”指的是哪个元素(您只能在一行中看到一些字母和数字)。 如果进一步看,您会发现字母和行是指“真实的”名称,例如“ machine1”。现在我的问题是:如何为转换编写代码,例如将“ target =“ abcd””切换为“ target ='machine2”'?
我有以下XML代码:
<uml:Model xmlns:xmi="http://www.omg.org/spec/XMI/20131001"
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML"
xmi:id="_x3pzQHiSEemHwJRDr6_Icw"
name="activity_diagram">
<Entity name="Activity_diagram">
<edge xmi:id="_51rDcHrnEemHwJRDr6_Icw"
target="abcd"
source="1234"/>
<edge xmi:id="_C81fcHrsEemj44S3Yi86Ww"
target="wwww"
source="abcd"/>
<edge xmi:id="_Dgu2sHrsEemj44S3Yi86Ww"
target="zuio"
source="wwww"/>
<edge xmi:id="_ECWWAHrsEemj44S3Yi86Ww"
target="yxcv"
source="zuio"/>
<node xmi:id="1234" name="machine1"/>
<node xmi:id="yxcv" name="machine5"/>
<node xmi:id="abcd" name="machine2"/>
<node xmi:id="zuio" name="machine4"/>
<node xmi:id="wwww" name="machine3"/>
</Entity>
</uml:Model>
提前谢谢!
答案 0 :(得分:1)
使用 key 查找节点名称-例如:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xmi="http://www.omg.org/spec/XMI/20131001">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="node-by-id" match="node" use="@xmi:id" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="edge">
<edge xmi:id="{@xmi:id}"
target="{key('node-by-id', @target)/@name}"
source="{key('node-by-id', @source)/@name}"/>
</xsl:template>
</xsl:stylesheet>