Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml xsl-n个值之和_Xml_Xslt - Fatal编程技术网

Xml xsl-n个值之和

Xml xsl-n个值之和,xml,xslt,Xml,Xslt,从下面的xml中,我想获取每个DESC元素中的值,只提取INV之前的值,将它们全部相加,并将总数打印到一个名为“total”的新元素中。换句话说,如果元素包含: <DESC>TEST SUPPLIER 1 250600FOO 805415446355485 000000002000.00INV 1234</DESC> 对所有DESC元素执行此操作,将它们添加到一起,并将其输出到名为Total的元素。D

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

<DESC>TEST SUPPLIER 1               250600FOO                805415446355485     000000002000.00INV   1234</DESC>
对所有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>

OW00007838
1.
测试供应商1 250600FOO 805415446355485 000000002000.00INV 1234
OW00007838
2.
测试供应商2 050712ACME 000256886355485 000000023020.35INV 65870
OW00007838
4.
测试供应商3 050712ABCD 000000 698745987 000000049158.68INV 02155
这是我未完成的样式表-我正在使用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。

在XSLT中,您只需执行以下操作:

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

试试这个

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

首先,您需要这个-
。您能使用XSLT 2.0吗,因为它有更好的方法来实现这一点?是的,我可以使用XSLT 2.0代替它。谢谢您编辑的原始文章。@Scrat这真的是samjudson建议的固定长度字符串吗?每个
DESC
是否都包含一个
INV
组件?Michael都是。Rudramuni在下面提供了一个非常有说服力的解决方案,之前使用了子字符串。
<Total>74179.03</Total>