gpt4 book ai didi

xml - XSL - 复制树,复制一些节点两次并在第二个副本中更改属性

转载 作者:行者123 更新时间:2023-12-04 04:53:05 25 4
gpt4 key购买 nike

我需要复制一棵树。但是对于某些节点(其中 attr2="yyy"),我想制作 2 个副本:

  • 第一个“原样”
  • 第二个修改 attr2 值。

  • 输入:
    <root>
    <element>
    <node1 attr1="xxx">copy once</node1>
    <node2 attr2="yyy">copy twice, modify attr2 in 2nd copy</node2>
    <node3 attr2="yyy" attr3="zzz">copy twice, modify attr2 in 2nd copy</node3>
    </element>
    </root>

    期望的输出:
    <root>
    <element>
    <node1 attr1="xxx">copy once</node1>
    <node2 attr2="yyy">copy twice, modify attr2 in 2nd copy</node2>
    <node2 attr2="changed">copy twice, modify attr2 in 2nd copy</node2>
    <node3 attr2="yyy" attr3="zzz">copy twice, modify attr2 in 2nd copy</node3>
    <node3 attr2="changed" attr3="zzz">copy twice, modify attr2 in 2nd copy</node3>
    </element>
    </root>

    我正在使用这个样式表:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:template match="node()|@*">
    <xsl:copy>
    <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
    </xsl:template>
    <xsl:template match="node()[@attr2='yyy']">
    <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
    <xsl:copy>
    <xsl:attribute name="attr2">changed</xsl:attribute>
    <xsl:apply-templates />
    </xsl:copy>
    </xsl:template>
    </xsl:stylesheet>

    并获得以下输出:
    <root>
    <element>
    <node1 attr1="xxx">copy once</node1>
    <node2 attr2="yyy">copy twice, modify attr2 in 2nd copy</node2>
    <node2 attr2="changed">copy twice, modify attr2 in 2nd copy</node2>
    <node3 attr2="yyy" attr3="zzz">copy twice, modify attr2 in 2nd copy</node3>
    <node3 attr2="changed">copy twice, modify attr2 in 2nd copy</node3>
    </element>
    </root>

    请注意,在 node3 的第二个副本中,缺少 attr3。如果我修改要应用于节点和属性的第二个模板:
    <xsl:copy>
    <xsl:attribute name="attr2">changed</xsl:attribute>
    <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>

    那么 attr2 不会被替换。

    到目前为止,我一直试图自己解决这个问题,但没有成功。我感谢任何帮助指出我正确的方向。

    最佳答案

    你很接近。仅缺少一项留置权。
    添加一行以复制所有属性<xsl:apply-templates select="@*"/> 在更改 attr2 内容之前。

    试试这个:

    <xsl:template match="node()[@attr2='yyy']">
    <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
    <xsl:copy>
    <xsl:apply-templates select="@*"/>
    <xsl:attribute name="attr2">changed</xsl:attribute>
    <xsl:apply-templates />
    </xsl:copy>
    </xsl:template>

    关于xml - XSL - 复制树,复制一些节点两次并在第二个副本中更改属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17134973/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com