xml - 是否可以使用XSLT对这些数据求和?

标签 xml xslt xpath xslt-1.0

是否可以使用XSLT对这些数据求和?我有以下数据集

<?xml version="1.0" encoding="utf-8"?>
<data>
    <recordType>EXP</recordType>
      <AppContribAmt>0.0</AppContribAmt>
      <LdgCost>658.82</LdgCost>
      <LabCostIn>0.0</LabCostIn>
      <LabCostOut>0.0</LabCostOut>
      <ServiceCost>0.0</ServiceCost>
      <MatCostIn>0.0</MatCostIn>
      <MatCostOut>0.0</MatCostOut>
      <ToolCostIn>0.0</ToolCostIn>
      <ToolCostOut>0.0</ToolCostOut>
      <recordType>ADD</recordType>
      <AppContribAmt>0.0</AppContribAmt>
      <LdgCost>932.5</LdgCost>
      <LabCostIn>104.64</LabCostIn>
      <LabCostOut>0.0</LabCostOut>
      <ServiceCost>0.0</ServiceCost>
      <MatCostIn>260.36</MatCostIn>
      <MatCostOut>0.0</MatCostOut>
      <ToolCostIn>0.0</ToolCostIn>
      <ToolCostOut>0.0</ToolCostOut>
      <recordType>ADD</recordType>
      <AppContribAmt>0.0</AppContribAmt>
      <LdgCost>932.5</LdgCost>
      <LabCostIn>104.64</LabCostIn>
      <LabCostOut>0.0</LabCostOut>
      <ServiceCost>0.0</ServiceCost>
      <MatCostIn>260.36</MatCostIn>
      <MatCostOut>0.0</MatCostOut>
      <ToolCostIn>0.0</ToolCostIn>
      <ToolCostOut>0.0</ToolCostOut>
      <recordType>ADD</recordType>
      <AppContribAmt>0.0</AppContribAmt>
      <LdgCost>932.5</LdgCost>
      <LabCostIn>104.64</LabCostIn>
      <LabCostOut>0.0</LabCostOut>
      <ServiceCost>0.0</ServiceCost>
      <MatCostIn>260.36</MatCostIn>
      <MatCostOut>0.0</MatCostOut>
      <ToolCostIn>0.0</ToolCostIn>
      <ToolCostOut>0.0</ToolCostOut>
      <recordType>EXP</recordType>
      <AppContribAmt>0.0</AppContribAmt>
      <LdgCost>0.0</LdgCost>
      <LabCostIn>322.95</LabCostIn>
      <LabCostOut>0.0</LabCostOut>
      <ServiceCost>0.0</ServiceCost>
      <MatCostIn>0.0</MatCostIn>
      <MatCostOut>0.0</MatCostOut>
      <ToolCostIn>0.0</ToolCostIn>
      <ToolCostOut>0.0</ToolCostOut>
</data>


我试图将recordType ='EXP'下的值总计为一个总和,recordType ='ADD'下的值总计为另一总和。这可能吗,还是我需要将XML格式更改为类似的格式?

<?xml version="1.0" encoding="utf-8"?>
<data>
    <recordType value='EXP'>
      <AppContribAmt>0.0</AppContribAmt>
      <LdgCost>658.82</LdgCost>
      <LabCostIn>0.0</LabCostIn>
      <LabCostOut>0.0</LabCostOut>
      <ServiceCost>0.0</ServiceCost>
      <MatCostIn>0.0</MatCostIn>
      <MatCostOut>0.0</MatCostOut>
      <ToolCostIn>0.0</ToolCostIn>
      <ToolCostOut>0.0</ToolCostOut>
</recordType>
<recordType value='ADD'>
      <AppContribAmt>0.0</AppContribAmt>
      <LdgCost>932.5</LdgCost>
      <LabCostIn>104.64</LabCostIn>
      <LabCostOut>0.0</LabCostOut>
      <ServiceCost>0.0</ServiceCost>
      <MatCostIn>260.36</MatCostIn>
      <MatCostOut>0.0</MatCostOut>
      <ToolCostIn>0.0</ToolCostIn>
      <ToolCostOut>0.0</ToolCostOut>
</recordType>
</data>

最佳答案

这是另一个XSLT 1.0选项,它稍微复杂一点,但是如果您拥有更大的数据集,则应该*更加高效。

*我使用Saxon-HE 9.6进行了测试,并复制了数据,因此文件为10,353行,此样式表的运行时间约为150毫秒,而其他答案为1500毫秒(基于“ -t”开关的输出)。结果可能因实际数据和处理器不同而异,因此您可能需要测试。

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="recordTypes" match="recordType" use="."/>
  <xsl:key name="byRecordType" match="*[not(self::recordType)]" 
    use="preceding-sibling::recordType[1]"/>

  <xsl:template match="/*">
    <results>
      <xsl:for-each select="recordType[count(.|key('recordTypes',.)[1])=1]">
        <xsl:apply-templates select="."/>
      </xsl:for-each>
    </results>
  </xsl:template>

  <xsl:template match="recordType">
    <sum type="{.}">
      <xsl:value-of select="sum(key('byRecordType',.))"/>
    </sum>
  </xsl:template>

</xsl:stylesheet>


输出量

<results>
   <sum type="EXP">981.77</sum>
   <sum type="ADD">3892.5</sum>
</results

关于xml - 是否可以使用XSLT对这些数据求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37892715/

相关文章:

java - 在 xml 中存储 html 标签

xml - 如何使用 XSLT 手动生成 XSD

java - 无法使用 Java 和 Selenium 通过部分链接文本查找元素

google-sheets - 谷歌表 : IMPORTXML from Yahoo Finance

c# - 我的属性搜索 XPath 查询有什么问题

php - 在命名空间 XML 中循环

Python 无法将变量添加到 XML

xml - XSLT PI 和样式表参数

xml - XSLT 参数的使用; <xsl :param> & <xsl:with-param>

html - 在 XSLT 中使用列表元素