【发布时间】:2021-02-16 21:37:37
【问题描述】:
我有一个 xml,其中同一员工在不同日期的不同条目如下:
<wd:Report_Data
<wd:Report_Entry>
<wd:workerGroup>
<wd:staffID>111</wd:staffID>
</wd:workerGroup>
<wd:workerType>Staff</wd:workerType>
<wd:requestType>Absence Request</wd:requestType>
<wd:date>2020-08-21-07:00</wd:date>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:workerGroup>
<wd:staffID>111</wd:staffID>
</wd:workerGroup>
<wd:workerType>Staff</wd:workerType>
<wd:requestType>Absence Request</wd:requestType>
<wd:date>2020-08-22-07:00</wd:date>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:workerGroup>
<wd:staffID>222</wd:staffID>
</wd:workerGroup>
<wd:workerType>Staff</wd:workerType>
<wd:requestType>Absence Request</wd:requestType>
<wd:date>2020-08-23-07:00</wd:date>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:workerGroup>
<wd:staffID>333</wd:staffID>
</wd:workerGroup>
<wd:workerType>Staff</wd:workerType>
<wd:requestType>Absence Request</wd:requestType>
<wd:date>2020-08-15-07:00</wd:date>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:workerGroup>
<wd:staffID>333</wd:staffID>
</wd:workerGroup>
<wd:workerType>Staff</wd:workerType>
<wd:requestType>Absence Request</wd:requestType>
<wd:date>2020-08-16-07:00</wd:date>
</wd:Report_Entry>
<wd:Report_Entry>
<wd:workerGroup>
<wd:staffID>333</wd:staffID>
</wd:workerGroup>
<wd:workerType>Staff</wd:workerType>
<wd:requestType>Absence Request</wd:requestType>
<wd:date>2020-08-29-07:00</wd:date>
</wd:Report_Entry>
</wd:Report_Data>
我想要一个输出,它将连续日期与开始日期和结束日期分组如下:
<wd:Report_Entry>
<worker>
<staffID>111</staffID>
<start_date>2020-08-21-07:00</start_date>
<end_date>2020-08-22-07:00</end_date>
</worker>
<worker>
<staffID>222</staffID>
<start_date>2020-08-23-07:00</start_date>
<end_date>2020-08-23-07:00</end_date>
</worker>
<worker>
<staffID>333</staffID>
<start_date>2020-08-15-07:00</start_date>
<end_date>2020-08-16-07:00</end_date>
</worker>
<worker>
<staffID>333</staffID>
<start_date>2020-08-29-07:00</start_date>
<end_date>2020-08-29-07:00</end_date>
</worker>
</wd:Report_Entry>
我曾尝试使用 group-starting-with,但它在分组时与人员 ID 无关。
<xsl:template match="/wd:Report_Data">
<wd:Report_Entry>
<xsl:for-each-group select="wd:Report_Entry" group-starting-with="*[not(xs:date(wd:date) = xs:date(preceding-sibling::*[1]/wd:date) + xs:dayTimeDuration('P1D'))] ">
<worker>
<staffID>
<xsl:value-of select="wd:workerGroup/wd:staffID"/>
</staffID>
<start_date>
<xsl:value-of select="wd:date"/>
</start_date>
<end_date>
<xsl:value-of select="current-group()[last()]/wd:date"/>
</end_date>
</worker>
</xsl:for-each-group>
<!-- </xsl:for-each-group> -->
</wd:Report_Entry>
</xsl:template>
得到如下输出错误:
<wd:Report_Entry>
<worker>
<staffID>111</staffID>
<start_date>2020-08-21-07:00</start_date>
<end_date>2020-08-23-07:00</end_date>
</worker>
</wd:Report_Entry>
【问题讨论】:
-
从单个示例中不清楚输入可以有哪些变化。在您的示例中,员工
111的两个项目是相邻的,然后是其他员工的项目。而且时差正好是一天。实际输入是否具有相同的简单结构,即两个相邻元素的时差为 1 天?一个员工可以有两个以上的项目吗? -
是的@MartinHonnen。每位员工每天都会有 1 个单独的报告条目。例如如果员工要求休假 5 天(例如 20 日至 24 日),那么我们每天将有 5 个不同的 Report_Entry - 20 日、21 日、22 日、23 日、24 日。然后我们可以为不同的员工采用同样的方式。上面的代码是一个真实的输入,除了staffID
标签: xml xslt grouping xslt-2.0 xslt-grouping