Unbounded XML Element to name/value pairs without repeating Element names in XSLT



I have written an xslt to convert an input xml file to name/value pairs.


The input xml is as follows:


INPUT.xml



<?xml version="1.0" encoding="UTF-8" ?>
<EMailData>
<PersonInfo>
<PersonID>PersonID1092</PersonID>
<EmailAddress>EmailAddress1093</EmailAddress>
<SecureToken>SecureToken1094</SecureToken>
<ContactPrimaryChannel>ContactPrimaryChannel1172</ContactPrimaryChannel>
<Order>
<OrderID>OrderID1224</OrderID>
<CustomerOrderNumber>CustomerOrderNumber1225</CustomerOrderNumber>
<OrderType/>
<Currency>Currency1226</Currency>
<OrderName/>
<OrderFrequency>OrderFrequency1227</OrderFrequency>
<IsRepeatDeliveryOrder>IsRepeatDeliveryOrder1228</IsRepeatDeliveryOrder>
<ProjectedShipmentDate>2015-02-05</ProjectedShipmentDate>
<NextShipmentDate>2015-02-05</NextShipmentDate>
<Total>1229</Total>
</Order>
<Order>
<OrderID>OrderID1259</OrderID>
<CustomerOrderNumber>CustomerOrderNumber1260</CustomerOrderNumber>
<OrderType/>
<Currency>Currency1261</Currency>
<OrderName/>
<OrderFrequency>OrderFrequency1262</OrderFrequency>
<IsRepeatDeliveryOrder>IsRepeatDeliveryOrder1263</IsRepeatDeliveryOrder>
<ProjectedShipmentDate>2015-02-05</ProjectedShipmentDate>
<NextShipmentDate>2015-02-05</NextShipmentDate>
<Total>1264</Total>
</Order>
</PersonInfo>
</EMailData>


I want the desired output in this way:


Desired_OUTPUT.XML



<?xml version="1.0" encoding="UTF-8"?>
<EMailData>

<property name="EVENTINFO">
<property name="PersonInfo">
------
values
------
<property name="Order">
<row>
----
values
----
</row>
<row> <!-- Only Row Value Repeated For More than One Order -->
----
values
----
</row>
</property>
</property>
</property>


This is the XSLT I used.


XSLT



<xsl:stylesheet version="1.0" xmlns:xsl="http://ift.tt/tCZ8VR">

<xsl:output method="xml" indent="yes"/>

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

<xsl:template match="EMailData/PersonInfo">
<property name="EVENTINFO">
<property name="{local-name()}">
<xsl:apply-templates select="@*|node()"/>
</property>
</property>
</xsl:template>

<xsl:template match="EMailData/PersonInfo/*">
<property name="{local-name()}">
<value>
<xsl:apply-templates />
</value>
</property>
</xsl:template>


<!-- Order begins -->

<xsl:template match="EMailData/PersonInfo/Order">
<property name="{local-name()}">
<row>
<xsl:apply-templates select="@*|node()"/>
</row>
</property>
</xsl:template>

<xsl:template match="EMailData/PersonInfo/Order/*">
<property name="{local-name()}">
<value>
<xsl:apply-templates />
</value>
</property>
</xsl:template>

<!-- Order Ends -->

</xsl:stylesheet>


After Applying this xslt I am Getting the output as:



<?xml version="1.0" encoding="UTF-8"?>
<EMailData>

<property name="EVENTINFO">
<property name="PersonInfo">
------
values
------
<property name="Order">
<row>
----
values
----
</row>
</property>
<property name="Order"> <!-- The Order Name is repeated -->
<row>
----
values
----
</row>
</property>
</property>
</property>
</EMailData>


Please Tell me Where I should Change my XSLT. Thanks in advance!


No comments:

Post a Comment