我正在尝试在代码中创建几个嵌套循环,以按 Time_Data/Time_Off/Code 进行分组。我想在输出中的 1 行上显示连续几天内的所有休假代码。任何额外的休假代码,无论是单日还是连续 2 天,都将分别在各自的行上输出。在此示例中,我提供了 2 个代码,其中一个代码连续 3 天,另一个代码连续 4 天。此外,该示例显示了 2 个不连续出现的代码。
这些示例有望帮助您更加清晰。
输入XML:
<?xml version="1.0" encoding="utf-8"?>
<Output xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Record>
<Employee_ID>123456</Employee_ID>
<Payroll_ID>1111</Payroll_ID>
<Time_Data>
<Date>2023-11-04</Date>
<Day>Saturday</Day>
<Time_Off>
<Code>DL</Code>
<Date>2023-11-04</Date>
<Quantity>7</Quantity>
<Unit>HOURS</Unit>
</Time_Off>
<Time_Off>
<Code>RJ</Code>
<Date>2023-11-04</Date>
<Quantity>1</Quantity>
<Unit>HOURS</Unit>
</Time_Off>
</Time_Data>
<Time_Data>
<Date>2023-11-05</Date>
<Day>Sunday</Day>
<Time_Off>
<Code>DL</Code>
<Date>2023-11-05</Date>
<Quantity>7</Quantity>
<Unit>HOURS</Unit>
</Time_Off>
<Time_Off>
<Code>RJ</Code>
<Date>2023-11-05</Date>
<Quantity>1</Quantity>
<Unit>HOURS</Unit>
</Time_Off>
</Time_Data>
<Time_Data>
<Date>2023-11-06</Date>
<Day>Monday</Day>
<Time_Off>
<Code>DL</Code>
<Date>2023-11-06</Date>
<Quantity>7</Quantity>
<Unit>HOURS</Unit>
</Time_Off>
<Time_Off>
<Code>RJ</Code>
<Date>2023-11-06</Date>
<Quantity>1</Quantity>
<Unit>HOURS</Unit>
</Time_Off>
</Time_Data>
<Time_Data>
<Date>2023-11-07</Date>
<Day>Tuesday</Day>
<Time_Off>
<Code>RJ</Code>
<Date>2023-11-07</Date>
<Quantity>1</Quantity>
<Unit>HOURS</Unit>
</Time_Off>
</Time_Data>
<Time_Data>
<Date>2023-11-15</Date>
<Day>Monday</Day>
<Time_Off>
<Code>DL</Code>
<Date>2023-11-15</Date>
<Quantity>7</Quantity>
<Unit>HOURS</Unit>
</Time_Off>
<Time_Off>
<Code>RJ</Code>
<Date>2023-11-15</Date>
<Quantity>1</Quantity>
<Unit>HOURS</Unit>
</Time_Off>
</Time_Data>
</Record>
</Output>
XSL 转换:
<xsl:for-each select="Output/Record">
<xsl:for-each-group select="Time_Data/Time_Off" group-by="concat(Code, '|', Date)">
<xsl:for-each-group select="current-group()" group-starting-with="*[not(xs:date(Date) = xs:date(preceding-sibling::*[1]/Date) + xs:dayTimeDuration('P1D'))]">
<xsl:value-of select="format-number(../../Payroll_ID, '00000000')"/>
<xsl:value-of select="' '"/>
<xsl:value-of select="format-date(Date, '[D01][M01]')"/>
<xsl:value-of select="format-date(current-group()[last()]/Date, '[D01][M01]')"/>
<xsl:value-of select="' '"/>
<xsl:value-of select="format-number(sum(current-group()/Quantity) * 100, '0000')"/>
<xsl:value-of select="Code"/>
<xsl:value-of select="'TT'"/>
<xsl:value-of select="$linefeed"/>
</xsl:for-each-group>
</xsl:for-each-group>
</xsl:for-each>
我收到的输出:
00001111 04110411 0700DLTT
00001111 04110411 0100RJTT
00001111 05110511 0700DLTT
00001111 05110511 0100RJTT
00001111 06110611 0700DLTT
00001111 06110611 0100RJTT
00001111 07110711 0100RJTT
00001111 15111511 0700DLTT
00001111 15111511 0100RJTT
我希望实现的输出:
00001111 04110611 2100DLTT
00001111 04110711 0400RJTT
00001111 15111511 0700DLTT
00001111 15111511 0100RJTT
任何人都可以提供一些关于我如何实现这一目标的指导吗?
我尝试嵌套多个按代码分组的 for-each-groups,但无法返回正确的行数。循环迭代太多次,我不理解正确的分组以实现所需的结果。
假设在初始组中不会有重复的日期,并且记录已按时间顺序排序,您应该能够使用以下方法执行辅助分组:
<xsl:for-each-group select="current-group()" group-adjacent="xs:date(Date) - position()*xs:dayTimeDuration('P1D')">
这应该为任何连续日期序列创建一个组(未经您的数据测试)。