【问题标题】:Move Xml Node by xslt通过 xslt 移动 Xml 节点
【发布时间】:2016-01-19 09:44:18
【问题描述】:

如何将选定的 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 中,有很多 Node 叫做“Root”和“Node”。 “Node”有一个名为“name”的属性。如果 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>

提前致谢。

【问题讨论】:

    标签: xslt


    【解决方案1】:

    看来您真正要移动的元素是Folder 而不是Node

    无论如何,我认为您基本上要做的就是设置为copy-of-Lines。一个用于所有没有您的“示例字符串”作为@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>
    

    【讨论】:

    • @Gururaj Venkatakrishnarao 太好了!你能接受答案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多