需要XSLT 2.0帮助-分组依据,总和,替换字符串

时间:2018-10-05 00:55:46

标签: xml xslt

需要基于employee-id分组的XSLT 2.0映射帮助。 XML文件将通过按员工ID分组汇总数量和工时来生成。 金额-“#”表示正数,而“#(”表示负数。 小时-这将是持续时间的总和。

我没有尝试使用Hours,而是尝试了Amount,除了字符(#,#(也有空白值,也没有尝试过),并且可以使用。),它需要您的帮助和专业知识。

输入数据:

<?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>

1 个答案:

答案 0 :(得分:0)

您那里有很多奇怪的数据,其中有一些空的HoursAmount元素,我选择在对值求和时忽略它们。另外,您还没有确切告诉我们您想要哪种输入格式以及想要哪种结果格式,我只是想假设Hours的格式为hh:mm,可以将其转换为{{1} },格式为“ PThhHmmM”,然后您想要对这些持续时间求和并将其作为持续时间输出:

xs:dayTimeDuration

https://xsltfiddle.liberty-development.net/94hvTzT有一个示例。