Reputation: 3
Trying to transform xml and group nodes by value and elements in xslt 2.0
I have got an input xml as below:
<?xml version='1.0' encoding='UTF-8'?>
<Applications>
<Application>
<applicationId>280</applicationId>
<cust_IDCheckIDCollation>
<Option>
<id>197249</id>
</Option>
</cust_IDCheckIDCollation>
<cust_overallduedilligencestatus>
<Option>
<id>197276</id>
</Option>
</cust_overallduedilligencestatus>
</Application>
<Application>
<applicationId>292</applicationId>
<cust_IDCheckIDCollation>
<Option>
<id>197249</id>
</Option>
</cust_IDCheckIDCollation>
<cust_overallduedilligencestatus>
<Option>
<id>197276</id>
</Option>
</cust_overallduedilligencestatus>
</Application>
<Application>
<applicationId>280</applicationId>
<cust_OnlineReferenceCheck>
<Option>
<id>197249</id>
</Option>
</cust_OnlineReferenceCheck>
<cust_overallduedilligencestatus>
<Option>
<id>197276</id>
</Option>
</cust_overallduedilligencestatus>
</Application>
<Application>
<applicationId>292</applicationId>
<cust_OnlineReferenceCheck>
<Option>
<id>197249</id>
</Option>
</cust_OnlineReferenceCheck>
<cust_overallduedilligencestatus>
<Option>
<id>197276</id>
</Option>
</cust_overallduedilligencestatus>
</Application>
<Application>
<applicationId>280</applicationId>
<cust_AustralianWorkRights>
<Option>
<id>197250</id>
</Option>
</cust_AustralianWorkRights>
<cust_overallduedilligencestatus>
<Option>
<id>197276</id>
</Option>
</cust_overallduedilligencestatus>
</Application>
<Application>
<applicationId>292</applicationId>
<cust_AustralianWorkRights>
<Option>
<id>197250</id>
</Option>
</cust_AustralianWorkRights>
<cust_overallduedilligencestatus>
<Option>
<id>197276</id>
</Option>
</cust_overallduedilligencestatus>
</Application>
<Application>
<applicationId>280</applicationId>
<cust_NationalPoliceCheck>
<Option>
<id>197249</id>
</Option>
</cust_NationalPoliceCheck>
<cust_overallduedilligencestatus>
<Option>
<id>197280</id>
</Option>
</cust_overallduedilligencestatus>
</Application>
<Application>
<applicationId>292</applicationId>
<cust_NationalPoliceCheck>
<Option>
<id>197249</id>
</Option>
</cust_NationalPoliceCheck>
<cust_overallduedilligencestatus>
<Option>
<id>197276</id>
</Option>
</cust_overallduedilligencestatus>
</Application>
</Applications>
I need to group it by applicationId and then sub group it by element name to remove duplicate elements. Also for cust_overallduediligencestatus node, I need to check if any of them contain 197280 value and if it does it should have that value in target xml. So the expected output for above input should be below.
Output Expected
<Applications>
<Application>
<applicationId>280</applicationId>
<cust_IDCheckIDCollation>
<Option>
<id>197249</id>
</Option>
</cust_IDCheckIDCollation>
<cust_overallduedilligencestatus>
<Option>
<id>197280</id>
</Option>
</cust_overallduedilligencestatus>
<cust_OnlineReferenceCheck>
<Option>
<id>197249</id>
</Option>
</cust_OnlineReferenceCheck>
<cust_AustralianWorkRights>
<Option>
<id>197250</id>
</Option>
</cust_AustralianWorkRights>
<cust_NationalPoliceCheck>
<Option>
<id>197249</id>
</Option>
</cust_NationalPoliceCheck>
</Application>
<Application>
<applicationId>292</applicationId>
<cust_IDCheckIDCollation>
<Option>
<id>197249</id>
</Option>
</cust_IDCheckIDCollation>
<cust_overallduedilligencestatus>
<Option>
<id>197280</id>
</Option>
</cust_overallduedilligencestatus>
<cust_OnlineReferenceCheck>
<Option>
<id>197249</id>
</Option>
</cust_OnlineReferenceCheck>
<cust_AustralianWorkRights>
<Option>
<id>197250</id>
</Option>
</cust_AustralianWorkRights>
<cust_NationalPoliceCheck>
<Option>
<id>197249</id>
</Option>
</cust_NationalPoliceCheck>
</Application>
<Applications>
Below is the xslt, am using. It groups the value and elements fine. However I am unable to search for 197280 value for cust_overallduediligencestatus and include that if present.
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/Applications">
<xsl:copy>
<xsl:for-each-group select="Application" group-by="applicationId">
<xsl:copy>
<xsl:copy-of select="applicationId"/>
<xsl:for-each-group select="current-group()/(* except applicationId)" group-by="name()">
<xsl:copy-of select="current-group()[1]"/>
</xsl:for-each-group>
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
I'm still new to xslt and any leads would be greatly appreciated.
Upvotes: 0
Views: 49
Reputation: 167716
It seems you want a check like
<xsl:template match="/Applications">
<xsl:copy>
<xsl:for-each-group select="Application" group-by="applicationId">
<xsl:copy>
<xsl:copy-of select="applicationId"/>
<xsl:for-each-group select="current-group()/(* except applicationId)" group-by="name()">
<xsl:copy-of select="if (current-grouping-key() = 'cust_overallduedilligencestatus' and current-group()/Option/id = 197280) then current-group()[Option/id = 197280] else current-group()[1]"/>
</xsl:for-each-group>
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
Upvotes: 1