Java 如何使用XLS转换复制XML节点并粘贴到同一级别

Java 如何使用XLS转换复制XML节点并粘贴到同一级别,java,xml,xslt,transformation,xls,Java,Xml,Xslt,Transformation,Xls,我想复制xml的一个节点并将其粘贴到同一级别 假设我有一个xml,如下所示 <MyXml> <system> <Groups> <Group id="01" check="true"> <name>Value</name> <age>test</age> </Group>

我想复制xml的一个节点并将其粘贴到同一级别

假设我有一个xml,如下所示

<MyXml>
    <system>
        <Groups>
            <Group id="01" check="true">
            <name>Value</name>
            <age>test</age>
        </Group>
        <Group id="02" check="true">
            <name>Value</name>
            <age>test</age>
        </Group>
        <Group id="03" check="true">
            <name>Value</name>
            <age>test</age>
        </Group>
        </Groups>
  </system>
</MyXml>

价值
测试
价值
测试
价值
测试
我想使用XSL转换复制组03并粘贴到与“04”相同的级别(组内)

预期产量

价值
测试
价值
测试
价值
测试
价值
测试
有人能帮我完成同样的XSL样式表吗。不确定下面的xsl是否正确。提前谢谢

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

<xsl:param name="groupId" />
<xsl:param name="newGroupId" />

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

<xsl:template match="MyXML/system/Groups/Group[@id=$groupId]" >
 <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
            <!--Wanted to do something for pasting the copied node and changing the id value with new Group Id.-->
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>

在XSLT1.0中,在模板匹配中使用变量表达式实际上被认为是错误的(尽管您可能会发现某些处理器允许这样做)

但是您可能应该做的是,在模板匹配
组中调用标识模板,然后使用
xsl:if
来决定是否复制它

请尝试此模板

<xsl:template match="Group" >
  <xsl:call-template name="identity" />;
  <xsl:if test="@id = $groupId">
    <group id="{$newGroupId}">
      <xsl:apply-templates select="@*[name() != 'id']|node()"/>
    </group>
  </xsl:if>
</xsl:template>

;

注意:在模板匹配中不需要
Group
的完整路径,除非在其他级别中存在您不想匹配的
Group
元素。(此外,您当前的匹配是指
MyXML
,而您的XML是
MyXML
。XSLT区分大小写,因此不会匹配)。

是否要使用java进行匹配?我将使用java Transformer类将其转换为xsl样式表。谢谢。这起作用了。但是,xml是用不需要的分号(;)编写的。新节点似乎与前一个节点在同一条线上。我是新手,无法在下一行找到保持相同的方法。这是因为我们在调用模板后加了分号。移除时获得正确的输出。
<xsl:template match="Group" >
  <xsl:call-template name="identity" />;
  <xsl:if test="@id = $groupId">
    <group id="{$newGroupId}">
      <xsl:apply-templates select="@*[name() != 'id']|node()"/>
    </group>
  </xsl:if>
</xsl:template>