Handling special characters in XSLT to get well-formed output XML

cdrw

New Member
I had requirement of transforming below input XML to desired output XML format. With help of this forum, I got the solution as below:Input XML\[code\]<?xml version="1.0"?><dataset xmlns="http://developer.cognos.com/schemas/xmldata/1/" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"><metadata> <item name="Employee Id" /> <item name="Employee Name" /> <item name="Department Name" /></metadata><data> <row> <value>1</value> <value Salutation="Dr." >John</value> <value>Finance</value> </row> <row> <value>2</value> <value Salutation="Mr." >Peter</value> <value>Admin</value> </row></data></dataset>\[/code\]XSLT Transformation\[code\]<?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:c="http://developer.cognos.com/schemas/xmldata/1/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output indent="yes"/><xsl:strip-space elements="*"/><xsl:variable name="vNames" select="/*/c:metadata/*/@name" /><xsl:template match="/*/c:data"> <dataset> <xsl:apply-templates/> </dataset></xsl:template><xsl:template match="c:row"> <row> <xsl:apply-templates/> </row></xsl:template><xsl:template match="c:row/*"> <xsl:variable name="vPos" select="position()"/> <xsl:element name="{translate($vNames[$vPos], ' ', '_')}"> <xsl:apply-templates select="@*"/> <xsl:apply-templates/> </xsl:element></xsl:template><xsl:template match="@*"> <xsl:attribute name="{name()}"> <xsl:value-of select="." /> </xsl:attribute></xsl:template></xsl:stylesheet>\[/code\]Desired Output XML\[code\]<?xml version="1.0" encoding="UTF-16"?><dataset xmlns:c="http://developer.cognos.com/schemas/xmldata/1/"><row> <Employee_Id>1</Employee_Id> <Employee_Name Salutation="Dr.">John</Employee_Name> <Department_Name>Finance</Department_Name></row><row> <Employee_Id>2</Employee_Id> <Employee_Name Salutation="Mr.">Peter</Employee_Name> <Department_Name>Admin</Department_Name></row>\[/code\]However, I came across a special scenario which breaks this solution. The attribute values in Input XML can start with Number, Special Character or Space.New Input XML\[code\]<?xml version="1.0"?><dataset xmlns="http://developer.cognos.com/schemas/xmldata/1/" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"><metadata> <item name="1Employee Id" /> <item name=" Employee Name" /> <item name="$Department Name" /></metadata><data><row> <value>1</value> <value Salutation="Dr." >John</value> <value>Finance</value></row><row> <value>2</value> <value Salutation="Mr." >Peter</value> <value>Admin</value></row></data></dataset>\[/code\]Since name attribute values are translated to Element names, above transformation fails as Element names cannot start with Number or Space. In this case I would like to replace those characters with some valid characters for Element name say \[code\]_\[/code\] or \[code\]C_\[/code\] to get the same desired Output XML.Kindly let me know how to handle this scenario.Any help would be highly appreciated.Thanks in advance.Regards
 
Back
Top