Требуется помощь XSLT 2.0 - group By, Sum, ReplaceString - PullRequest
0 голосов
/ 05 октября 2018

Требуется помощь в сопоставлении XSLT 2.0 на основе группировки идентификатора сотрудника.XML-файл будет создан путем суммирования количества и часов путем группировки идентификатора сотрудника.Сумма - «#» означает положительное число, где «# (» означает отрицательное число. Часы - это будет сумма времени.

Я не пробовал с часами, но пробовал с суммой, кроме символов (#, # (также не пробовали, если оно имеет пустое значение) и оно работает. Нужна ваша помощь и опыт для завершения того же.

Входные данные:

<?xml version="1.0" ?>
<Employees>
 <Employee>
  <Amount>#1,424.85</Amount>
  <EmployeeID>1</EmployeeID>
  <Name>Bob</Name>
  <Surname>Shibob</Surname>
  <Hours>24:20</Hours>
 </Employee>
 <Employee>
  <Amount>#(1,424.85</Amount>
  <EmployeeID>1</EmployeeID>
  <Name>Bob</Name>
  <Surname>Shibob</Surname>
  <Hours>56:00</Hours>
 </Employee>
 <Employee>
  <Amount>#70</Amount>
  <EmployeeID>2</EmployeeID>
  <Name>Sara</Name>
  <Surname>Lee</Surname>
  <Hours>57.30</Hours>
 </Employee>
 <Employee>
  <Amount>#(1,001.20</Amount>
  <EmployeeID>3</EmployeeID>
  <Name>John</Name>
  <Surname>Smith</Surname>
  <Hours></Hours>
 </Employee>
 <Employee>
  <Amount></Amount>
  <EmployeeID>4</EmployeeID>
  <Name>Penny</Name>
  <Surname>Wise</Surname>
  <Hours>56:59</Hours>
 </Employee>
 <Employee>
  <Amount>#(.30</Amount>
  <EmployeeID>4</EmployeeID>
  <Name>Penny</Name>
  <Surname>Wise</Surname>
  <Hours>26:03</Hours>
 </Employee>
</Employees>

My XSLTКод:

    <?xml version="1.0" ?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- Define keys used to group elements -->
    <xsl:key name="keyEmployeeID" match="Employee" use="EmployeeID" />
    <xsl:template match="/">
    <Employees>
    <xsl:for-each select="//Employee[generate-id(.) = generate-id(key('keyEmployeeID', EmployeeID)[1])]">
    <Employee>
     <xsl:variable name="empID">.
    <xsl:value-of select="EmployeeID" /></xsl:variable>
     <EmployeeID><xsl:value-of select="EmployeeID" /></EmployeeID>

     <Name1><xsl:value-of select="//Employee[EmployeeID=$empID]/Name" /></Name1>
     <Surname><xsl:value-of select="//Employee[EmployeeID=$empID]/Surname" /></Surname>
    <!-- Show the total Amount for the current Employee -->
    <code><xsl:value-of select="sum(//Employee[EmployeeID=$empID]/Amount)" /></code>
    </Employee>
    </xsl:for-each>
    </Employees>   
    </xsl:template>
    </xsl:stylesheet>

1 Ответ

0 голосов
/ 05 октября 2018

Там много странных данных, есть пустые элементы Hours или Amount, я решил игнорировать их при суммировании значений.Кроме того, вы не сказали нам, какой именно у вас входной формат и какой формат результата вы хотите. Я просто попытался предположить, что Hours в каком-то формате hh:mm и может быть преобразован в xs:dayTimeDuration в формате `PThhHmmM'и затем вы хотите суммировать эти длительности и вывести их в виде длительностей:

  <xsl:template match="Employees">
      <xsl:copy>
          <xsl:for-each-group select="Employee" group-by="EmployeeID">
              <xsl:copy>
                  <xsl:apply-templates select="EmployeeID, Name, Surname"/>
                  <code>
                      <xsl:value-of select="sum(current-group()/Amount[normalize-space()]/xs:decimal(replace(replace(., '[#,]', ''), '\(', '-')))"/>
                  </code>
                  <hours>
                      <xsl:value-of select="sum(current-group()/Hours[normalize-space()]/xs:dayTimeDuration(concat('PT', replace(., '([0-9]{1,2}):([0-9]{1,2})', '$1H$2M'))))"/>
                  </hours>
              </xsl:copy>
          </xsl:for-each-group>
      </xsl:copy>
  </xsl:template>

https://xsltfiddle.liberty -development.net / 94hvTzT имеет образец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...