Нужна помощь по сопоставлению 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>

Мой код 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>
0
Sreejata Pal 5 Окт 2018 в 03:55

1 ответ

Лучший ответ

У вас много странных данных, есть пустые элементы Hours или Amount, я решил игнорировать их при суммировании значений. Кроме того, вы не сообщили нам, какой именно формат ввода у вас есть и какой формат результата вам нужен, я просто попытался предположить, что Hours имеют некоторый формат hh:mm и могут быть преобразованы в {{X4} } в формате `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 содержит образец.

0
Martin Honnen 5 Окт 2018 в 20:01