通过子节点的值排序XML父节点

问题描述:

我是XSLT的新手。请帮我解决一下这个。 按字段FORNAMN升序的ValidFrom对每个同事的EmploymentUpdateRequests进行排序,并将XML文件中的EmploymentUpdateRequests写入。通过子节点的值排序XML父节点

我只能根据员工编号进行排序,该编号将按顺序对所有相同的员工编号进行分组,但无法使用xslt根据有效的升序进行进一步排序。

请帮忙。

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> 

预期输出:

<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> 

此XML需要在预期在上面的例子中的方式进行排序。可以请一些人分享这个xslt样本。

+0

你能编辑你的问题来显示你当前的XSLT吗?谢谢! –

<?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> 
+0

你好,非常感谢你的回复。我得到错误,JAXP:在转换期间出错 - 无法找到函数:current-group;行号:13;列号#:56 – Kavitha

+0

您正在使用哪种处理器?你在使用JAXP吗? – user3681005

+0

请使用Saxon-PE 9.5.1.7,它在我的身边完美地工作。 – user3681005