0

How to move the selected Xml Node to the last of the selected Node. below is a sample 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>

in the above Xml, there are so many Nodes called "Root" and "Node". the "Node" has an attribute named "name". If the name attribute values Contains a string "Sample Node", then it has to move to last of the matched "Node". How can we achieve this by xslt.

below is the Expected result:

<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>

the change has to happen for

<Folder name="Folder1">
            <Node name="Sample Node">
                <LevelGroup>
                    <Level name="1">First Level</Level>
                    <Level name="5">Fifth Level</Level>
                </LevelGroup>
            </Node>
        </Folder>

Thanks in Advance.

1 Answer 1

1

It seems that the element you actually want to move is Folder and not Node

Anyway, I think all you have to do basically, is to set to copy-of-Lines. One for all those elements without your "sample string" as @name, one for those with. So, try the code below:

<?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>
Sign up to request clarification or add additional context in comments.

1 Comment

@Gururaj Venkatakrishnarao That's great! Can you please accept the answer?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.