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

Xml XSL-复制树,复制一些节点两次,并在第二次复制中更改属性,xml,xslt,Xml,Xslt,我需要复制一棵树。但对于某些节点(其中attr2=“yyy”),我希望制作两个副本: 第一个“原样” 第二个修改attr2值 输入: <root> <element> <node1 attr1="xxx">copy once</node1> <node2 attr2="yyy">copy twice, modify attr2 in 2nd copy</node2> &

我需要复制一棵树。但对于某些节点(其中attr2=“yyy”),我希望制作两个副本:

  • 第一个“原样”
  • 第二个修改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>
    
    
    复制一次
    复制两次,在第二次复制中修改属性2
    复制两次,在第二次复制中修改属性2
    
    期望输出:

    <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>
    
    
    复制一次
    复制两次,在第二次复制中修改属性2
    复制两次,在第二次复制中修改属性2
    复制两次,在第二次复制中修改属性2
    复制两次,在第二次复制中修改属性2
    
    我正在使用这个样式表:

    <?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>
    
    
    复制一次
    复制两次,在第二次复制中修改属性2
    复制两次,在第二次复制中修改属性2
    复制两次,在第二次复制中修改属性2
    复制两次,在第二次复制中修改属性2
    
    请注意,节点3的第二个副本中缺少attr3。如果修改要应用于节点和属性的第二个模板:

    <xsl:copy>
        <xsl:attribute name="attr2">changed</xsl:attribute>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
    
    
    改变
    
    那么attr2就不会被替换


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

    你已经很接近了。只缺少一个留置权。
    添加一行以复制所有属性

    在更改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>
    
    
    改变
    
    太棒了!非常感谢!我只能接受你的问题,没有投票的理由,对不起