I have an input XML, which I need to transform using XSLT 2.0.
Here is my input xml :
<root>
<person>
<LastName>yyyyy</LastName>
<FirstName>xxxx</FirstName>
<profession>IT/xx</profession>
<area>0000</area>
<email>xxx.yyy@xxx.com</email>
<Address>aaaaaaaaa,bbbbbbbbbbbb,cccccccccc,dddddddddd,eeeeeeee</Address>
<sex>male</sex>
</person>
</root>
My input xml is missing some nodes. For example (mobile, country which are mandatory as per xsd). Now, I need to add those two nodes ( as empty nodes) and then I need to sort including those two nodes.
Sort order should be : FirstName,LastName,email,sex,profession,mobile,Address,area,country;
Final output xml should be :
<root>
<person>
<FirstName>xxxx</FirstName>
<LastName>yyyyy</LastName>
<email>xxx.yyy@xxx.com</email>
<sex>male</sex>
<profession>IT/xx</profession>
<mobile/>
<Address>aaaaaaaaa,bbbbbbbbbbbb,cccccccccc,dddddddddd,eeeeeeee</Address>
<area>0000</area>
<country/>
</person>
</root>
I tried with the below XSLT :
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pOrderedNames" select="'FirstName,LastName,email,sex,profession,mobile,Address,area,country'"/>
<xsl:template match="node()|@*" >
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="person[not(./country)]" mode="country">
<xsl:element name="country" />
</xsl:template>
<xsl:template match="person[not(./mobile)]" mode="mobile">
<xsl:element name="mobile" />
</xsl:template>
<xsl:template match="*" mode="sorter">
<xsl:copy>
<xsl:apply-templates>
<xsl:sort data-type="number" select="string-length(substring-before($pOrderedNames,concat(',',name(),',')))"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="person">
<xsl:copy>
<xsl:apply-templates select="node()"/>
<xsl:apply-templates select="self::node()" mode="mobile"/>
<xsl:apply-templates select="self::node()" mode="country"/>
<xsl:apply-templates select="self::node()" mode="email"/>
<xsl:apply-templates select="self::node()" mode="sex"/>
<xsl:apply-templates select="self::*" mode="sorter"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
And with the above XSLT it is getting transformed as below :
<root>
<person>
<LastName>yyyyy</LastName>
<FirstName>xxxx</FirstName>
<profession>IT/xx</profession>
<area>0000</area>
<email>xxx.yyy@xxx.com</email>
<Address>aaaaaaaaa,bbbbbbbbbbbb,cccccccccc,dddddddddd,eeeeeeee</Address>
<sex>male</sex>
<mobile/>
<country/>yyyyyxxxxIT/xx0000xxx.yyy@xxx.comaaaaaaaaa,bbbbbbbbbbbb,cccccccccc,dddddddddd,eeeeeeeemaleyyyyyxxxxIT/xx0000xxx.yyy@xxx.comaaaaaaaaa,bbbbbbbbbbbb,cccccccccc,dddddddddd,eeeeeeeemale<person>
<FirstName>xxxx</FirstName>
<LastName>yyyyy</LastName>
<email>xxx.yyy@xxx.com</email>
<sex>male</sex>
<profession>IT/xx</profession>
<Address>aaaaaaaaa,bbbbbbbbbbbb,cccccccccc,dddddddddd,eeeeeeee</Address>
<area>0000</area>
</person>
</person>
</root>
Can someone help me out here, please.
Thanks in Advance.