【发布时间】:2022-01-17 21:07:26
【问题描述】:
我对分组员工休假有一个非常具体的要求,其中天是连续的,持续时间是半天。这是为了将它们合并为一个完整的值,其中请假在夜班工作。复杂性来自一个事实,即不能连续超过 2 天被合并到一个组中。
示例 XML
<wd:Report_Data xmlns:wd="urn:com.workday.report/WFM_Future_Leave_Report">
<wd:Report_Entry>
<wd:Worker_group>
<wd:Partner_ID>11111111</wd:Partner_ID>
<wd:unit_id>001</wd:unit_id>
</wd:Worker_group>
<wd:Partner_ID>80710042</wd:Partner_ID>
<wd:Time_Off_Details_group>
<wd:Effective_Date>2021-09-06-07:00</wd:Effective_Date>
<wd:Eligible>1</wd:Eligible>
<wd:Duration>0.5</wd:Duration>
<wd:Status wd:Descriptor="A">
</wd:Status>
</wd:Time_Off_Details_group>
<wd:Time_Off_Details_group>
<wd:Effective_Date>2021-09-07-07:00</wd:Effective_Date>
<wd:Eligible>1</wd:Eligible>
<wd:Duration>0.5</wd:Duration>
<wd:Status wd:Descriptor="A">
</wd:Status>
</wd:Time_Off_Details_group>
<wd:Time_Off_Details_group>
<wd:Effective_Date>2021-09-08-07:00</wd:Effective_Date>
<wd:Eligible>1</wd:Eligible>
<wd:Duration>0.5</wd:Duration>
<wd:Status wd:Descriptor="A">
</wd:Status>
</wd:Time_Off_Details_group>
<wd:Time_Off_Details_group>
<wd:Effective_Date>2021-09-09-07:00</wd:Effective_Date>
<wd:Eligible>0</wd:Eligible>
<wd:Duration>1</wd:Duration>
<wd:Status wd:Descriptor="A">
</wd:Status>
</wd:Time_Off_Details_group>
<wd:Time_Off_Details_group>
<wd:Effective_Date>2021-09-10-07:00</wd:Effective_Date>
<wd:Eligible>1</wd:Eligible>
<wd:Duration>0.5</wd:Duration>
<wd:Status wd:Descriptor="A">
</wd:Status>
</wd:Time_Off_Details_group>
<wd:Time_Off_Details_group>
<wd:Effective_Date>2021-09-11-07:00</wd:Effective_Date>
<wd:Eligible>1</wd:Eligible>
<wd:Duration>0.5</wd:Duration>
<wd:Status wd:Descriptor="A">
</wd:Status>
</wd:Time_Off_Details_group>
<wd:Time_Off_Details_group>
<wd:Effective_Date>2021-09-12-07:00</wd:Effective_Date>
<wd:Eligible>1</wd:Eligible>
<wd:Duration>0.5</wd:Duration>
<wd:Status wd:Descriptor="A">
</wd:Status>
</wd:Time_Off_Details_group>
<wd:Time_Off_Details_group>
<wd:Effective_Date>2021-09-13-07:00</wd:Effective_Date>
<wd:Eligible>1</wd:Eligible>
<wd:Duration>0.5</wd:Duration>
<wd:Status wd:Descriptor="A">
</wd:Status>
</wd:Time_Off_Details_group>
</wd:Report_Entry>
</wd:Report_Data>
而我一直在使用的 XSLT,我知道这会将有效日期中断的叶子分组,所以根本不会做我想要的。
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="3.0"
xmlns:wd="urn:com.workday.report/WFM_Future_Leave_Report"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xtt="urn:com.workday/xtt">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="wd:Report_Entry">
<xsl:for-each-group select="wd:Time_Off_Details_group[wd:Eligible = '1' and wd:Status/@wd:Descriptor = 'A']"
group-starting-with="*[not(xs:date(wd:Effective_Date) = xs:date(preceding-sibling::*[1]/wd:Effective_Date) + xs:dayTimeDuration('P1D'))]">
<xsl:value-of select="../wd:Partner_ID" />
<xsl:text>,</xsl:text>
<xsl:value-of select="../wd:Worker_group/wd:unit_id"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="current-group()[1]/format-date(wd:Effective_Date,'[D1]/[M01]/[Y0001]')" />
<xsl:text>,</xsl:text>
<xsl:value-of select="sum(current-group()/wd:Duration)"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="wd:Status/@wd:Descriptor"/>
<xsl:text>,</xsl:text>
<xsl:text>NIGHTSHIFTLOGIC</xsl:text>
<xsl:text>
</xsl:text>
</xsl:for-each-group>
</xsl:template>
<xsl:template name="match_text" match="text()"/>
</xsl:stylesheet>
(Eligible = ‘1’ 标记持续时间为 0.5,Status = ‘A’ 仅过滤出已批准的休假)
在这个例子中,期望的输出是:
11111111,001,06/09/2021,1,A
11111111,001,08/09/2021,0.5,A
11111111,001,09/09/2021,1,A
11111111,001,10/09/2021,1,A
11111111,001,12/09/2021,1,A
这是因为 06/09 和 07/09 的 0.5 个持续时间合并为一整天。第一组不应考虑下一个连续日,因为它没有后续 0.5 天的持续时间实例,应独立输出。同样,如果 09/09 存在一整天的持续时间,则需要按原样输出。分组在 10/09 的下一个 0.5 持续时间条目再次开始,并与 11/09 相结合,后者输出另一个全天,然后再次为接下来的两个连续有效日期条目。
【问题讨论】:
-
一个示例 XML 文件将使其更容易推理,并能够提出解决方案。如果它们是连续的,那么将日期按两个分组的唯一标准是?例如,如果日期是 1/12、3/12(不是 2 月),您会希望它们被分组吗?
-
您使用的是哪个处理器,哪个工具?使用 XQuery 的翻转窗口和各种变量,条件可能比使用 XSLT 2/3 的 group-starting-with 更容易表达。当然,如果您展示您的 XML 输入结构以及您在 XSLT 中使用 group-starting-with 进行的尝试,这将有所帮助。
标签: xslt