This is a short and simple (without explicit conditional instructions) conversion :
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/> <xsl:template match="node()|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> <xsl:template match="employee"> <employee active="{activeFlag}"> <xsl:apply-templates select="node()|@*"/> </employee> </xsl:template> <xsl:template match="activeFlag"/> </xsl:stylesheet>
when applied to the provided XML document :
<employees> <employee> <employeeNumber>1234</employeeNumber> <startdate>01/02/2003</startdate> <activeFlag>true</activeFlag> <firstname>Erik</firstname> <address> <addressline1>123 Main</addressline1> <zip>07016</zip> <state>New Jersey</state> <city>My City</city> </address> </employee> </employees>
creates the desired, correct result :
<employees> <employee active="true"> <employeeNumber>1234</employeeNumber> <startdate>01/02/2003</startdate> <firstname>Erik</firstname> <address> <addressline1>123 Main</addressline1> <zip>07016</zip> <state>New Jersey</state> <city>My City</city> </address> </employee> </employees>
Explanation : rule override using AVT .
If you want to handle cases where the activeFlag child does not exist activeFlag , it becomes a little more complicated :
<xsl:template match="employee"> <employee active= "{concat(activeFlag, substring('false', 1 div not(activeFlag)) ) }"> <xsl:apply-templates select="node()|@*"/> </employee> </xsl:template>
source share