Нужна помощь в преобразовании XSLT для XML - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь написать XSLT-преобразование для описанной ниже проблемы.

В настоящее время детали Swipe хранятся в сторонней системе и принимаются в виде csv. При этом у нас есть несколько записей IN & OUT в день для сотрудника.

Намерение состоит в том, чтобы получить только одну запись о первом входе в систему и одну запись о времени последнего прохода по сотруднику, смене и дате.

Ниже мой xml.

Как я могу написать XSLT, чтобы получить только один Swipe In (который должен быть первым swipeIn за день и в смену) и один Swipe out (который должен быть последним), по Emp, Shift и Day.

Но для сотрудников ночной смены (код 1 C в XML) измените дату последнего скачка, поскольку это ночная смена (ночная смена начинается с 17:00 (сегодня) до 4:00 (завтра).

Я думаю, это можно сделать с помощью группировки по emp, дате и смещению, но не уверен, как преобразовать данные, а также для ночной смены.

<?xml version="1.0" encoding="UTF-8"?>
<Data>
    <Employees>
        <Date>2019-12-16</Date>
        <Time>08:53:54</Time>
        <Empid>100</Empid>
        <Gate>B-1a Main Door 2</Gate>
        <InOut>In</InOut>
        <Remark>Successful</Remark>
        <Shift>1A</Shift>
    </Employees>
    <Employees>
        <Date>2019-12-16</Date>
        <Time>10:53:54</Time>
        <Empid>100</Empid>
        <Gate>B-1a Main Door 3</Gate>
        <InOut>Out</InOut>
        <Remark>Successful</Remark>
        <Shift>1A</Shift>
    </Employees>
    <Employees>
        <Date>2019-12-16</Date>
        <Time>11:10:54</Time>
        <Empid>100</Empid>
        <Gate>B-1a Main Door 2</Gate>
        <InOut>In</InOut>
        <Remark>Successful</Remark>
        <Shift>1A</Shift>
    </Employees>
    <Employees>
        <Date>2019-12-16</Date>
        <Time>12:53:54</Time>
        <Empid>100</Empid>
        <Gate>B-1a Main Door 3</Gate>
        <InOut>Out</InOut>
        <Remark>Successful</Remark>
        <Shift>1A</Shift>
    </Employees>
        <Employees>
        <Date>2019-12-16</Date>
        <Time>14:00:54</Time>
        <Empid>100</Empid>
        <Gate>B-1a Main Door 2</Gate>
        <InOut>In</InOut>
        <Remark>Successful</Remark>
        <Shift>1A</Shift>
    </Employees>
    <Employees>
        <Date>2019-12-16</Date>
        <Time>18:00:54</Time>
        <Empid>100</Empid>
        <Gate>B-1a Main Door 3</Gate>
        <InOut>Out</InOut>
        <Remark>Successful</Remark>
        <Shift>1A</Shift>
    </Employees>    
     <Employees>
        <Date>2019-12-16</Date>
        <Time>17:30:54</Time>
        <Empid>101</Empid>
        <Gate>B-1a Main Door 2</Gate>
        <InOut>In</InOut>
        <Remark>Successful</Remark>
        <Shift>1C</Shift>
    </Employees>
    <Employees>
        <Date>2019-12-16</Date>
        <Time>19:00:54</Time>
        <Empid>101</Empid>
        <Gate>B-1a Main Door 3</Gate>
        <InOut>Out</InOut>
        <Remark>Successful</Remark>
        <Shift>1C</Shift>
    </Employees>
    <Employees>
        <Date>2019-12-16</Date>
        <Time>20:10:54</Time>
        <Empid>101</Empid>
        <Gate>B-1a Main Door 2</Gate>
        <InOut>In</InOut>
        <Remark>Successful</Remark>
        <Shift>1C</Shift>
    </Employees>
    <Employees>
        <Date>2019-12-16</Date>
        <Time>23:53:54</Time>
        <Empid>101</Empid>
        <Gate>B-1a Main Door 3</Gate>
        <InOut>Out</InOut>
        <Remark>Successful</Remark>
        <Shift>1C</Shift>
    </Employees>
        <Employees>
        <Date>2019-12-17</Date>
        <Time>01:30:54</Time>
        <Empid>101</Empid>
        <Gate>B-1a Main Door 2</Gate>
        <InOut>In</InOut>
        <Remark>Successful</Remark>
        <Shift>1C</Shift>
    </Employees>
    <Employees>
        <Date>2019-12-17</Date>
        <Time>03:00:54</Time>
        <Empid>101</Empid>
        <Gate>B-1a Main Door 3</Gate>
        <InOut>Out</InOut>
        <Remark>Successful</Remark>
        <Shift>1C</Shift>
    </Employees>
        </Employees>
        <Employees>
        <Date>2019-12-17</Date>
        <Time>03:30:54</Time>
        <Empid>101</Empid>
        <Gate>B-1a Main Door 2</Gate>
        <InOut>In</InOut>
        <Remark>Successful</Remark>
        <Shift>1C</Shift>
    </Employees>
    <Employees>
        <Date>2019-12-17</Date>
        <Time>04:00:54</Time>
        <Empid>101</Empid>
        <Gate>B-1a Main Door 3</Gate>
        <InOut>Out</InOut>
        <Remark>Successful</Remark>
        <Shift>1C</Shift>
    </Employees>
</Data>

Вывод должен быть: введите описание изображения здесь

1 Ответ

0 голосов
/ 31 января 2020

Вы можете повторно использовать группировку из аналогичного вопроса, вывести только две строки данных для каждой группы:

<?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"
    expand-text="yes"
    exclude-result-prefixes="#all"
    version="3.0">

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

  <xsl:output method="html" indent="yes" html-version="5"/>

  <xsl:template match="Data">
      <table>
          <thead>
              <tr>
                  <th>Date</th>
                  <th>Time</th>
                  <th>EmpId</th>
                  <th>InOut</th>
                  <th>Shift</th>
                  <th>Comment</th>
              </tr>
          </thead>
          <xsl:for-each-group select="Employees" composite="yes" 
              group-by="Empid, 
                        if (Shift != '1C') 
                        then 
                          xs:date(Date) 
                        else if (xs:time(Time) lt xs:time('08:00:00'))
                        then 
                          xs:date(Date) - xs:dayTimeDuration('P1D')
                        else 
                          xs:date(Date), 
                        Shift">
              <tbody>
                  <xsl:variable name="min-dateTime"
                    select="min(current-group()/xs:dateTime(Date || 'T' || Time))"/>
                  <xsl:variable name="max-dateTime"
                    select="max(current-group()/xs:dateTime(Date || 'T' || Time))"/>
                  <tr>
                      <td>{format-dateTime($min-dateTime, '[M]-[D]-[Y]')}</td>
                      <td>{format-dateTime($min-dateTime, '[H01]:[m01]:[s01]')}</td>
                      <td>{current-grouping-key()[1]}</td>
                      <td>In</td>
                      <td>{current-grouping-key()[3]}</td>
                      <td>{Shift} Schedule In Time</td>
                  </tr>
                  <tr>
                      <td>{format-dateTime($max-dateTime, '[M]-[D]-[Y]')}</td>
                      <td>{format-dateTime($max-dateTime, '[H01]:[m01]:[s01]')}</td>
                      <td>{current-grouping-key()[1]}</td>
                      <td>Out</td>
                      <td>{current-grouping-key()[3]}</td>
                      <td>{Shift} - Schedule Out Time</td>
                  </tr>
              </tbody>
          </xsl:for-each-group>
      </table>
  </xsl:template>
  <xsl:template match="/">
    <html>
      <head>
        <title>.NET XSLT Fiddle Example</title>
      </head>
      <body>
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/bFWRAp4/1

...