2017-08-10 125 views
1

我是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嗎?謝謝! –

回答

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

相關問題