【问题标题】:Using sum() function for string nodes in XSLT对 XSLT 中的字符串节点使用 sum() 函数
【发布时间】:2014-01-04 02:10:57
【问题描述】:

我在 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 函数返回的数字是值而不是节点,因此错误很明显。但是我该怎么做呢?我没有想法......

【问题讨论】:

    标签: xslt xpath xslt-1.0


    【解决方案1】:

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

    1. 编写一个递归命名模板,为每个值调用一次并添加下一个值
    2. 使用exslt:node-set()扩展函数构造一个节点集并将sum()应用于结果
    3. 使用 Dimitre Novatchev 的 FXSL 库

    如果可以,请移至 XSLT 2.0,这样这些问题就变得微不足道了。

    【讨论】:

    • 你能给我一个提示吗?我尝试了第二种方式:&lt;xsl:value-of select="sum(exsl:node-set(translate(translate(ROW/LINES/*/L_AMOUNT,' ',''),',','.')))"/&gt; 但它只返回第一个节点。也许递归模板会更容易?只是提示!
    • 嗯,我给了你一个提示,但显然还不够。要使用 exslt:node-set 方法,您需要将源树转换为新树(在 xsl:variable 中),其中数字以其转换后的形式显示为元素值。像&lt;xsl:variable name="x"&gt;&lt;xsl:for-each select="//L_AMOUNT"&gt;&lt;n&gt;&lt;xsl:value-of select="translate...."/&gt;&lt;/n&gt;&lt;/xsl:for-each&gt;&lt;/xsl:variable&gt; 然后sum(exslt:node-set($x)/n)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 2011-07-02
    • 2014-01-07
    相关资源
    最近更新 更多