在XSLT转换中基于Element属性求和

时间:2014-12-07 17:14:10

标签: xml xslt xslt-2.0 xslt-grouping

我面临着XML转换的问题。我需要将文本文件中的输出转换为','分隔。我需要根据Descriptor类型做总计。

输出应如下所示:

Co code ID    type   amount
DEEP1   12345  phone  14
DEEP1   12345  food   8
DEEP1   12346  phone  16

XML:

<Root>
<Employees>
<Employee>
<Co_Code>DEEP1</Co_Code>
<ID>12345</ID>
</Employee>
<Type Descriptor="Phone"></Type>
<amount>8</amount>
</Employees>
<Employees>
<Employee>
<Co_Code>DEEP1</Co_Code>
<ID>12345</ID>
</Employee>
<Type Descriptor="Phone"></Type>
<amount>6</amount>
</Employees>
<Employees>
<Employee>
<Co_Code>DEEP1</Co_Code>
<ID>12345</ID>
</Employee>
<Type Descriptor="Food"></Type>
<amount>8</amount>
</Employees>
<Employees>
<Employee>
<Co_Code>DEEP1</Co_Code>
<ID>12346</ID>
</Employee>
<Type Descriptor="Phone"></Type>
<amount>8</amount>
</Employees>
<Employees>
<Employee>
<Co_Code>DEEP1</Co_Code>
<ID>12346</ID>
</Employee>
<Type Descriptor="Phone"></Type>
<amount>8</amount>
</Employees>
</Root>

如果需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

目前尚不清楚Employees元素是否可以包含多个Employee元素。如果不是这种情况,那么您可以按如下方式进行分组:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

<xsl:param name="sep" select="', '"/>

<xsl:output method="text"/>

<xsl:template match="Root">
  <xsl:value-of select="'Co Code', 'ID', 'type', 'amount'" separator="{$sep}"/>
  <xsl:text>&#10;</xsl:text>
  <xsl:for-each-group select="Employees" group-adjacent="Type/@Descriptor">
    <xsl:if test="position() gt 1"><xsl:text>&#10;</xsl:text></xsl:if>
    <xsl:value-of select="Employee/Co_Code, Employee/ID, current-grouping-key(), sum(current-group()/amount)"
      separator="{$sep}"/>
  </xsl:for-each-group>
</xsl:template>

</xsl:stylesheet>