通过子节点的值排序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样本。
<?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>
你好,非常感谢你的回复。我得到错误,JAXP:在转换期间出错 - 无法找到函数:current-group;行号:13;列号#:56 – Kavitha
您正在使用哪种处理器?你在使用JAXP吗? – user3681005
请使用Saxon-PE 9.5.1.7,它在我的身边完美地工作。 – user3681005
你能编辑你的问题来显示你当前的XSLT吗?谢谢! –