I have a scenario where I am exporting a .net dataset to an xml file, but I want to transform the stucture of the xml output to a more hierarchical structure. Below is the format of the dataset as exported by dataset.xmlwrite() method.
<NewDataSet>
<Table>
<id>100</id>
<empname>Joe Smith</empname>
<phone>111-111-1111</phone>
<mobile>222-222-2222</mobile>
</Table>
<Table>
<id>101</id>
<empname>Ann Jensen</empname>
<phone>111-111-0000</phone>
<mobile>222-222-0000</mobile>
</Table>
<NewDataSet>
I want to convert it to the below structure. I am a newbie at xsl transforms and I am not sure how keep the <Table> element from repeating for every record in the dataset.
<NewDataSet>
<Table>
<employee id="100">
<empname>Joe Smith</empname>
<phone>111-111-1111</phone>
<mobile>222-222-2222</mobile>
</employee>
<employee id="101">
<empname>Ann Jensen</empname>
<phone>111-111-0000</phone>
<mobile>222-222-0000</mobile>
</employee>
</Table>
<NewDataSet>
I tried using a combination of xsl:for-each and xsl:if statements to get what I wanted, but so far I have not been able to get it to work. Any assistance would be greatly appreciated.
This transformation:
when applied on the provided XML document (corrected to be well-formed):
produces the wanted, correct result:
Explanation:
The identity rule copies every node “as-is”.
The first
Tableelement is matched by an overriding template. This creates the onlyTablein the result and applies templates to the children of allTableelements.The
idelement is matched by an overriding template, that converts it to anemployeeelement having anidattribute with the value of theidelement. This also applies templates from inside theemployeeelement to all other siblings ofidand they are copied as-is by the identity template.