arjun ajjarapu
arjun ajjarapu

Reputation: 91

XSLT 1.0 - Move certain elements into a new parent

Thank you for taking the time to look at my question

I have a source xml that looks like so

   <root>
    <a>asdf</a>
    <b>asdfdsaf</b>
    <c>adfasd</c>
    <d>asddf</d>
    <e></e>
    <others>
        <foo>sdfd</foo>
        <bar>hghg</bar>
    </others>
</root>

I need to wrap certain elements Eg:a,b,c into a new parent and remove empty elements.

so output like so

   <root>
    <newparent>
        <a>asdf</a>
        <b>asdfdsaf</b>
        <c>adfasd</c>
    </newparent>
    <d>asddf</d>
    <others>
        <foo>sdfd</foo>
        <bar>hghg</bar>
    </others>
</root>

I managed to remove the empty elements using this XSL -

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="*"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*[not(@*) and not(*) and (not(text()) or .=-1)]"/>

    <xsl:template match="name">


    </xsl:template>

</xsl:stylesheet>

Getting stuck at adding the newparent node. Any pointers/help is much appreciated.

Upvotes: 0

Views: 70

Answers (2)

michael.hor257k
michael.hor257k

Reputation: 116982

Try it this way:

XSLT 1.0

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

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

<xsl:template match="/root">
    <xsl:copy>
        <newparent>
            <xsl:apply-templates select="a|b|c"/>
        </newparent>
        <xsl:apply-templates select="*[not(self::a or self::b or self::c)]"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="*[not(@* or node())]"/>

</xsl:stylesheet>

Upvotes: 1

imran
imran

Reputation: 461

<xsl:template match="root">
        <xsl:copy>
            <newparent>
                <xsl:copy-of select="a|b|c"/>
             </newparent>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*[.= '' or name() ='a' or name()='b' or name()='c']"/>
check it if it is fullfill your requirement.

Upvotes: 0

Related Questions