按xslt移动Xml节点

时间:2016-01-19 09:44:18

标签: xslt

如何将选定的Xml节点移动到所选节点的最后一个节点。下面是一个示例xml。

<Custom>
    <Root name="root1">
        <Folder name="Folder1">
            <Node name="Sample Node">
                <LevelGroup>
                    <Level name="1">First Level</Level>
                    <Level name="5">Fifth Level</Level>
                </LevelGroup>
            </Node>
        </Folder>
        <Folder name="Folder2">
            <Node name="Node A">
                <LevelGroup>
                    <Level name="1">First Level</Level>
                    <Level name="2">Second Level</Level>
                </LevelGroup>
            </Node>
            <Node name="Node C">
                <LevelGroup>
                    <Level name="4">Fourth Level</Level>
                    <Level name="5">Fifth Level</Level>
                </LevelGroup>
            </Node>
        </Folder>
    </Root>
    <Root name="root2">
        <Folder name="FolderA">
            <Node name="Node X">
                <LevelGroup>
                    <Level name="1">First Level</Level>
                </LevelGroup>
            </Node>
        </Folder>
    </Root> 
    <Root name="root4">
        <Folder name="FolderC">
            <Node name="Node Z">
                <LevelGroup>
                    <Level name="1">First Level</Level>
                </LevelGroup>
            </Node>
        </Folder>
    </Root>
</Custom>

在上面的Xml中,有很多名为“ Root ”和“ Node ”的节点。 “节点”具有名为“名称”的属性。如果name属性值包含字符串“Sample Node”,则必须移动到匹配的“ Node ”的最后一个。我们如何通过xslt实现这一目标。

以下是预期结果:

<Custom>
    <Root name="root1">     
        <Folder name="Folder2">
            <Node name="Node A">
                <LevelGroup>
                    <Level name="1">First Level</Level>
                    <Level name="2">Second Level</Level>
                </LevelGroup>
            </Node>
            <Node name="Node C">
                <LevelGroup>
                    <Level name="4">Fourth Level</Level>
                    <Level name="5">Fifth Level</Level>
                </LevelGroup>
            </Node>
        </Folder>
        <Folder name="Folder1">
            <Node name="Sample Node">
                <LevelGroup>
                    <Level name="1">First Level</Level>
                    <Level name="5">Fifth Level</Level>
                </LevelGroup>
            </Node>
        </Folder>
    </Root>
    <Root name="root2">
        <Folder name="FolderA">
            <Node name="Node X">
                <LevelGroup>
                    <Level name="1">First Level</Level>
                </LevelGroup>
            </Node>
        </Folder>
    </Root> 
    <Root name="root4">
        <Folder name="FolderC">
            <Node name="Node Z">
                <LevelGroup>
                    <Level name="1">First Level</Level>
                </LevelGroup>
            </Node>
        </Folder>
    </Root>
</Custom>

的变化必须发生
<Folder name="Folder1">
            <Node name="Sample Node">
                <LevelGroup>
                    <Level name="1">First Level</Level>
                    <Level name="5">Fifth Level</Level>
                </LevelGroup>
            </Node>
        </Folder>

先谢谢。

1 个答案:

答案 0 :(得分:1)

您实际想要移动的元素似乎是Folder而不是Node

无论如何,我认为你基本上要做的就是设置为copy-of - 行。一个没有你的&#34;样本字符串的所有元素&#34;作为@name,一个用于。所以,试试下面的代码:

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

    <xsl:template match="Custom">
        <xsl:copy> 
        <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Root">
        <xsl:copy>
           <xsl:for-each select="@*"><xsl:attribute name="{name()}"><xsl:value-of select="."/></xsl:attribute></xsl:for-each>

            <xsl:copy-of select="Folder[not(descendant::Node[@name='Sample Node'])]"/>
            <xsl:copy-of select="Folder[descendant::Node[@name='Sample Node']]"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>