xsl - n个值的总和

时间:2015-11-25 09:09:38

标签: xml xslt

从下面的xml中,我想获取每个 DESC 元素中的值,仅提取 INV 之前的值并将它们全部添加并将总数打印到a新元素称为“总计”。换句话说,如果元素包含:

<DESC>TEST SUPPLIER 1               250600FOO                805415446355485     000000002000.00INV   1234</DESC>

然后我只想提取:

000000002000.00

并对所有 DESC 元素执行此操作,将它们一起添加并输出到名为 Total 的元素。 DESC 元素可以出现n次。下面是一个有三次出现的xml:

<?xml version="1.0" encoding="iso-8859-1"?>
 <root>
  <FOO>OW00007838</FOO>
  <BAR>1</BAR>
  <DESC>TEST SUPPLIER 1               250600FOO                805415446355485     000000002000.00INV   1234</DESC>
  <FOO>OW00007838</FOO>
  <BAR>2</BAR>
  <DESC>TEST SUPPLIER 2               050712ACME                 000256886355485     000000023020.35INV   65870</DESC>
  <FOO>OW00007838</FOO>
  <BAR>4</BAR>
  <DESC>TEST SUPPLIER 3               050712ABCD                          000000698745987     000000049158.68INV   02155</DESC>
</root>

这是我未完成的样式表 - 我正在使用子字符串来尝试提取值,但不确定它是否有效。考虑使用substring-before和-after的组合代替:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:exsl="http://exslt.org/common">
<xsl:output indent="yes"/>

<xsl:template match="/">
 <Total>
  <xsl:variable name="subTotals"> 
   <xsl:for-each  select="/root/DESC">
    <number>
     <xsl:value-of select="substring(.,86,16)"/>
    </number>
   </xsl:for-each>
  </xsl:variable>
  <xsl:value-of select="sum(exsl:node-set($subTotals)/number)"/>
 </Total>
</xsl:template>    

目前输出仅返回0.

2 个答案:

答案 0 :(得分:1)

试试这个,

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

<xsl:template match="/">
  <Total>
    <xsl:value-of select="
      sum(/root/DESC/number(tokenize(substring-before(., 'INV'),' ')[last()]))"/>
  </Total>
</xsl:template>

</xsl:stylesheet>

结果:

<Total>74179.03</Total>

答案 1 :(得分:0)

在XSLT中,您可以这样做:

<xsl:template match="/">
  <Total><xsl:value of select="sum(/root/DESC/number(substring(., 86,16)))</Total>
</xsl:template>

关键是将子字符串包装在number()中以确保将其转换为数字。这对你上面的XSLT 1.0版本也有帮助,我不确定。

此外,您的数据看起来有效。在第一个DESC编号从76开始,而最后一个从87开始。