Xml XSL-复制树,复制一些节点两次,并在第二次复制中更改属性
我需要复制一棵树。但对于某些节点(其中attr2=“yyy”),我希望制作两个副本: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> &
<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>
改变
太棒了!非常感谢!我只能接受你的问题,没有投票的理由,对不起