首页 > 解决方案 > 使用 XSLT 根据时间更改日期

问题描述

我有一个带有考勤报告的 xml 文件,每个用户都有一个“间隔”元素。这里的问题是,当员工在第二天注销时,即使对于 Out 元素(例如第二个元素),日期也始终设置为 In 日期:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<transferStaffAttendance version='0.2'>
    <user>100994</user>
       <intervalStart>2020-03-02</intervalStart>
       <intervalEnd>2020-03-02</intervalEnd>
    <entries>
    <entry>
    <entryStart>
         <date>2020-03-02</date>
         <time>06:37</time>
    </entryStart>
    <entryEnd>
         <date>2020-03-02</date>
         <time>15:34</time>
    </entryEnd>
    </entry>
    </entries>
</interval>
<interval>
    <user>101400</user>
       <intervalStart>2020-03-02</intervalStart>
       <intervalEnd>2020-03-02</intervalEnd>
    <entries>
    <entry>
    <entryStart>
         <date>2020-03-02</date>
         <time>00:00</time>
    </entryStart>
    <entryEnd>
         <date>2020-03-02</date>
         <time>00:00</time>
    </entryEnd>
    </entry>
    </entries>
</interval>
<interval>
    <user>102806</user>
       <intervalStart>2020-03-02</intervalStart>
       <intervalEnd>2020-03-02</intervalEnd>
    <entries>
    <entry>
    <entryStart>
         <date>2020-03-02</date>
         <time>18:47</time>
    </entryStart>
    <entryEnd>
         <date>2020-03-02</date>
         <time>03:10</time>
    </entryEnd>
    </entry>
    </entries>
</interval>
</transferStaffAttendance>

如果用户在午夜后退出,我想通过计算 In 和 Out 值之间的差异来将日期更改为下一个日期,如下所示:

<interval>
    <user>102806</user>
       <intervalStart>2020-03-02</intervalStart>
       <intervalEnd>2020-03-03</intervalEnd>
    <entries>
    <entry>
    <entryStart>
         <date>2020-03-02</date>
         <time>18:47</time>
    </entryStart>
    <entryEnd>
         <date>2020-03-03</date>
         <time>03:10</time>
    </entryEnd>
    </entry>
    </entries>
</interval>

如何使用 XSLT 做到这一点?

标签: xmlxslt

解决方案


在 XSLT 2 和 3 中,您可以使用运算符+和 anxs:date和持续时间作为操作数来进行日期算术:

<?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"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="interval[entries/entry/entryEnd/time &lt; entries/entry/entryStart/time]/intervalEnd
                       |
                       interval/entries[entry/entryEnd/time &lt; entry/entryStart/time]/entry/entryEnd/date">
      <xsl:copy>
          <xsl:value-of select="xs:date(.) + xs:dayTimeDuration('P1D')"/>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

推荐阅读