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

发布于 2024-10-28 12:55:34 字数 886 浏览 2 评论 0原文

我有一个格式为

<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的xml,但这也应该在所有边上更改。例如,我将node1的id更改为“1a1”,因此它应该更改边的来源xml 中任意位置的“1a1”。 它应该对所有节点和边执行此操作。剩余的 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 。

任何帮助将不胜感激。 谢谢

I have an xml with the format

<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>

Now i want to change the id of node using generate-id() but that should change in all edges too.Eg i change the id of node1 to '1a1' so it should change the source of edge to '1a1' everwhere in xml.
It should do this for all nodes and edges.The remaining xml should be as it is.

My 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>

this changes the node id but i want to compare the edges source and target and change them too.
The edge source and target are some nodes id .

Any help would be greatly appreciated.
Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

终止放荡 2024-11-04 12:55:34

这个样式表:

<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>

This stylesheet:

<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>

With this well formed input:

<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>

Output:

<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>
走走停停 2024-11-04 12:55:34

将此部分添加到您已有的 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>

Add this section to the XSL that you already have.

<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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文