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

时间:2018-08-02 11:16:20

标签: java xml xslt transformation xls

我想复制一个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”相同的级别(组内)。

预期产量

<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>
            <Group id="04" check="true">
                <name>Value</name>
                <age>test</age>
            </Group>
        </Groups>
  </system>
</MyXml>

有人可以帮忙完成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>

1 个答案:

答案 0 :(得分:1)

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

但是您可能应该做的是在与Group匹配的模板中调用身份模板,然后让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个元素。 (另外,当您的XML将其命名为MyXML时,当前匹配项是指MyXml。XSLT区分大小写,因此不会匹配)。