将xml复制到另一个但更改节点属性和边缘属性

时间:2011-03-29 18:40:57

标签: xslt

我有一个格式为

的xml
<graph id=1>
  <nodes>
   <node id =2>
    <name value=node1/>
   </node>
   <node id =3>
    <name value=node3/>
   </node>
   <edges>
     <edge id=11 source=2 target=3/>
   </edges>
 </graph>

现在我想使用generate-id()更改节点的id,但是也应该在所有边缘都改变.Eg我将node1的id更改为'1a1'所以它应该将edge的源更改为'1a1'永远在xml中。 它应该对所有节点和边缘执行此操作。剩余的xml应该是原样。

我的xsl

<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="@id[parent::node]">
  <xsl:attribute name="id">
  <xsl:value-of select="generate-id()"/>
    </xsl:attribute>
</xsl:template>

这会更改节点ID但我想比较边缘源和目标并更改它们。 边缘源和目标是一些节点id。

非常感谢任何帮助。 感谢

2 个答案:

答案 0 :(得分:1)

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="kElementById" match="*[@id]" use="@id"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="@id">
        <xsl:attribute name="id">
            <xsl:value-of select="generate-id(..)"/>
        </xsl:attribute>
    </xsl:template>
    <xsl:template match="@source|@target">
        <xsl:attribute name="{name()}">
            <xsl:value-of select="generate-id(key('kElementById',.))"/>
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

通过这个良好的输入:

<graph id="1">
    <nodes>
        <node id ="2">
            <name value="node1"/>
        </node>
        <node id ="3">
            <name value="node3"/>
        </node>
        <edges>
            <edge id="11" source="2" target="3"/>
        </edges>
    </nodes>
</graph>

输出:

<graph id="IDAEQBBB">
    <nodes>
        <node id="IDAHQBBB">
            <name value="node1"></name>
        </node>
        <node id="IDALQBBB">
            <name value="node3"></name>
        </node>
        <edges>
            <edge id="IDAQQBBB" source="IDAHQBBB" target="IDALQBBB"></edge>
        </edges>
    </nodes>
</graph>

答案 1 :(得分:0)

将此部分添加到您已有的XSL中。

<xsl:template match="@source[parent::edge]|@target[parent::edge]">
    <xsl:attribute name="{name()}">
        <xsl:value-of select="generate-id(//node[@id=current()]/@id)"/>
    </xsl:attribute>
</xsl:template>