如果在指定日期范围内,如何申请每个组并为每个列出的代码返回 1 行?

问题描述 投票:0回答:1

我正在尝试在代码中创建几个嵌套循环,以按 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,但无法返回正确的行数。循环迭代太多次,我不理解正确的分组以实现所需的结果。

xml xslt xml-parsing xslt-2.0 transformation
1个回答
0
投票

假设在初始组中不会有重复的日期,并且记录已按时间顺序排序,您应该能够使用以下方法执行辅助分组:

<xsl:for-each-group select="current-group()" group-adjacent="xs:date(Date) - position()*xs:dayTimeDuration('P1D')">

这应该为任何连续日期序列创建一个组(未经您的数据测试)。

© www.soinside.com 2019 - 2024. All rights reserved.