在XSLT中对字符串节点使用sum()函数

时间:2014-01-04 02:10:58

标签: xslt xpath xslt-1.0

我在xslt 1.0中使用sum()函数时遇到问题。简而言之:我想在L_AMOUNT个节点中对值进行求和。

这是我的xml:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="XX_EXEC_PRINT_DOCUMENT.xsl"?>
<ROWSET>
 <ROW>
  <LINES>
   <LINES_ROW>
    <L_AMOUNT>330,00</L_AMOUNT>
   </LINES_ROW>
   <LINES_ROW>
    <L_AMOUNT>995 650,00</L_AMOUNT>
   </LINES_ROW>
  </LINES>
 </ROW>
</ROWSET>

xsl文件的重要部分:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns="http://www.w3.org/1999/xhtml">
  <xsl:output method="html"/>
  <xsl:template match="*">
    <html>
      <body class="OraBody">

          <xsl:value-of select="sum(translate(translate(ROW/LINES/*/L_AMOUNT,' ',''),',','.'))"/>

      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

正如你可以看到的那样,我试图将两者之间的所有空格都整理掉并用点替换逗号。但是,firefox解析器说XPath表达式应该返回NodeSet。 translate函数返回的数字是值而不是节点,因此错误很明显。但是我怎么能这样做呢?我没有想法......

1 个答案:

答案 0 :(得分:1)

在XSLT 1.0中,sum()的参数必须是节点集,而translate的结果不是节点集(它是字符串)。在XSLT 1.0中有多种方法可以对计算值求和,但没有一种非常令人满意:

  1. 编写一个递归的命名模板,为每个值调用一次并添加下一个值
  2. 使用exslt:node-set()扩展功能构建节点集并将sum()应用于结果
  3. 使用Dimitre Novatchev的FXSL库
  4. 如果可以,请转到XSLT 2.0,这些问题变得微不足道。