Kavitha
Kavitha

Reputation: 15

Sorting XML parent nodes by the value of child node

I am new to XSLT. Please help me with this. Sort the EmploymentUpdateRequests for each co-worker by ValidFrom of the Field FORNAMN Ascending and write the EmploymentUpdateRequests in the XML file.

I am only able to sort based on employee number which will group all the same employee number in order but unable to further sort based on validfrom in ascending order using xslt.

Please help.

Input XML:

<EmploymentUpdateRequests>
<EmploymentUpdateRequest>
  <CompanyNo>0017</CompanyNo>
  <EmploymentNo>020410</EmploymentNo>
  <Fields>
    <FieldValue Name="EmpFrom" Type="Date">
      <ValidFrom Format="yyyy-MM-dd">2016-10-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-10-18</ValidUntil>
      <Value Format="yyyy-MM-dd">2016-10-19</Value>
    </FieldValue>
    <FieldValue Name="FORNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-10-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-10-18</ValidUntil>
      <Value>Nicoleta Geta</Value>
    </FieldValue>
    <FieldValue Name="EFTERNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-10-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-10-18</ValidUntil>
      <Value>Juenker Roberts</Value>
    </FieldValue>
    <FieldValue Name="LANGUAGE" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-10-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-10-18</ValidUntil>
      <Value>el</Value>
    </FieldValue>
  </Fields>
</EmploymentUpdateRequest>
<EmploymentUpdateRequest>
  <CompanyNo>0017</CompanyNo>
  <EmploymentNo>020413</EmploymentNo>
  <Fields>
    <FieldValue Name="EmpFrom" Type="Date">
      <ValidFrom Format="yyyy-MM-dd">2016-10-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2099-12-31</ValidUntil>
      <Value Format="yyyy-MM-dd">2016-10-19</Value>
    </FieldValue>
    <FieldValue Name="FORNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-10-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2099-12-31</ValidUntil>
      <Value>Nicoleta Geta</Value>
    </FieldValue>
    <FieldValue Name="EFTERNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-10-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2099-12-31</ValidUntil>
      <Value>Juenker Roberts</Value>
    </FieldValue>
</Fields>
</EmploymentUpdateRequest>
<EmploymentUpdateRequest>
  <CompanyNo>0017</CompanyNo>
  <EmploymentNo>020413</EmploymentNo>
  <Fields>
    <FieldValue Name="EmpFrom" Type="Date">
      <ValidFrom Format="yyyy-MM-dd">2016-11-29</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2099-12-31</ValidUntil>
      <Value Format="yyyy-MM-dd">2016-11-29</Value>
    </FieldValue>
    <FieldValue Name="FORNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-11-29</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2099-12-31</ValidUntil>
      <Value>Nicoleta Geta</Value>
    </FieldValue>
    <FieldValue Name="EFTERNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-11-29</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2099-12-31</ValidUntil>
      <Value>Juenker Robert</Value>
    </FieldValue>
  </Fields>
</EmploymentUpdateRequest>
<EmploymentUpdateRequest>
  <CompanyNo>0017</CompanyNo>
  <EmploymentNo>020410</EmploymentNo>
  <Fields>
    <FieldValue Name="EmpFrom" Type="Date">
      <ValidFrom Format="yyyy-MM-dd">2016-12-18</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-12-17</ValidUntil>
      <Value Format="yyyy-MM-dd">2016-12-18</Value>
    </FieldValue>
    <FieldValue Name="FORNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-12-18</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-12-17</ValidUntil>
      <Value>Nicoleta Geta</Value>
    </FieldValue>
    <FieldValue Name="EFTERNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-12-18</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-12-17</ValidUntil>
      <Value>Juenker Roberts</Value>
    </FieldValue>
   </Fields>
</EmploymentUpdateRequest>
<EmploymentUpdateRequest>
  <CompanyNo>0017</CompanyNo>
  <EmploymentNo>020410</EmploymentNo>
  <Fields>
    <FieldValue Name="EmpFrom" Type="Date">
      <ValidFrom Format="yyyy-MM-dd">2016-01-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-01-18</ValidUntil>
      <Value Format="yyyy-MM-dd">2016-10-19</Value>
    </FieldValue>
    <FieldValue Name="FORNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-01-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-01-18</ValidUntil>
      <Value>Nicoleta Geta</Value>
    </FieldValue>
    <FieldValue Name="EFTERNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-01-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-01-18</ValidUntil>
      <Value>Juenker Roberts</Value>
    </FieldValue>
  </Fields>
</EmploymentUpdateRequest>
</EmploymentUpdateRequests>

Expected Output:

<EmploymentUpdateRequests>
<EmploymentUpdateRequest>
  <CompanyNo>0017</CompanyNo>
  <EmploymentNo>020410</EmploymentNo>
  <Fields>
    <FieldValue Name="EmpFrom" Type="Date">
      <ValidFrom Format="yyyy-MM-dd">2016-01-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-01-18</ValidUntil>
      <Value Format="yyyy-MM-dd">2016-10-19</Value>
    </FieldValue>
    <FieldValue Name="FORNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-01-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-01-18</ValidUntil>
      <Value>Nicoleta Geta</Value>
    </FieldValue>
    <FieldValue Name="EFTERNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-01-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-01-18</ValidUntil>
      <Value>Juenker Roberts</Value>
    </FieldValue>
  </Fields>
</EmploymentUpdateRequest>
<EmploymentUpdateRequest>
  <CompanyNo>0017</CompanyNo>
  <EmploymentNo>020410</EmploymentNo>
  <Fields>
    <FieldValue Name="EmpFrom" Type="Date">
      <ValidFrom Format="yyyy-MM-dd">2016-10-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-10-18</ValidUntil>
      <Value Format="yyyy-MM-dd">2016-10-19</Value>
    </FieldValue>
    <FieldValue Name="FORNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-10-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-10-18</ValidUntil>
      <Value>Nicoleta Geta</Value>
    </FieldValue>
    <FieldValue Name="EFTERNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-10-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-10-18</ValidUntil>
      <Value>Juenker Roberts</Value>
    </FieldValue>
    <FieldValue Name="LANGUAGE" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-10-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-10-18</ValidUntil>
      <Value>el</Value>
    </FieldValue>
  </Fields>
</EmploymentUpdateRequest>
<EmploymentUpdateRequest>
  <CompanyNo>0017</CompanyNo>
  <EmploymentNo>020410</EmploymentNo>
  <Fields>
    <FieldValue Name="EmpFrom" Type="Date">
      <ValidFrom Format="yyyy-MM-dd">2016-12-18</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-12-17</ValidUntil>
      <Value Format="yyyy-MM-dd">2016-12-18</Value>
    </FieldValue>
    <FieldValue Name="FORNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-12-18</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-12-17</ValidUntil>
      <Value>Nicoleta Geta</Value>
    </FieldValue>
    <FieldValue Name="EFTERNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-12-18</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2016-12-17</ValidUntil>
      <Value>Juenker Roberts</Value>
    </FieldValue>
   </Fields>
</EmploymentUpdateRequest>
<EmploymentUpdateRequest>
  <CompanyNo>0017</CompanyNo>
  <EmploymentNo>020413</EmploymentNo>
  <Fields>
    <FieldValue Name="EmpFrom" Type="Date">
      <ValidFrom Format="yyyy-MM-dd">2016-10-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2099-12-31</ValidUntil>
      <Value Format="yyyy-MM-dd">2016-10-19</Value>
    </FieldValue>
    <FieldValue Name="FORNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-10-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2099-12-31</ValidUntil>
      <Value>Nicoleta Geta</Value>
    </FieldValue>
    <FieldValue Name="EFTERNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-10-19</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2099-12-31</ValidUntil>
      <Value>Juenker Roberts</Value>
    </FieldValue>
</Fields>
</EmploymentUpdateRequest>
<EmploymentUpdateRequest>
  <CompanyNo>0017</CompanyNo>
  <EmploymentNo>020413</EmploymentNo>
  <Fields>
    <FieldValue Name="EmpFrom" Type="Date">
      <ValidFrom Format="yyyy-MM-dd">2016-11-29</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2099-12-31</ValidUntil>
      <Value Format="yyyy-MM-dd">2016-11-29</Value>
    </FieldValue>
    <FieldValue Name="FORNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-11-29</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2099-12-31</ValidUntil>
      <Value>Nicoleta Geta</Value>
    </FieldValue>
    <FieldValue Name="EFTERNAMN" Type="String">
      <ValidFrom Format="yyyy-MM-dd">2016-11-29</ValidFrom>
      <ValidUntil Format="yyyy-MM-dd">2099-12-31</ValidUntil>
      <Value>Juenker Robert</Value>
    </FieldValue>
  </Fields>
</EmploymentUpdateRequest>
</EmploymentUpdateRequests>

This xml needs to be sorted in the way expected in the above example. Could some please share the xslt sample for this.

Upvotes: 1

Views: 442

Answers (1)

user3681005
user3681005

Reputation: 136

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match="EmploymentUpdateRequests">
        <xsl:copy>
            <xsl:for-each-group select="EmploymentUpdateRequest"
                group-by="descendant::FieldValue[@Name ='FORNAMN']">
                <xsl:sort select="descendant::FieldValue[@Name ='FORNAMN']/ValidFrom" order="ascending"/>
                <xsl:copy-of select="current-group()"/>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>


</xsl:stylesheet>

Upvotes: 2

Related Questions