如果元素具有具有特定ID的附加属性,则更改属性的值

时间:2019-05-23 09:50:03

标签: xml xslt

首先,我将简短地描述我想做的事情:我正在与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>

Here is my current code, as you can see I wanted to reduce the complexity of the code that´s why the actual code is a bit different than the one you can see above

提前谢谢!

1 个答案:

答案 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>
相关问题