3

我有以下 XML 结构:

  <example>
    <data>
       <numberGer>3,40</numberGer>
    </data>
    <data>
      <numberGer>7,40</numberGer>
    </data>
    <data>
       <numberGer>17,40</numberGer>
    </data>
  </example>

我需要所有“numberGer”节点的总和。数字的格式是一个问题。由于使用了“,”,函数“sum”会产生错误。所以像 sum(//numberGer) 这样的东西不起作用。我可以使用 XSLT 2.0 函数。

我想我需要编写一个递归模板,它采用计算值和节点列表。

就像是:

<xsl:template name="addGerNumbers">
        <xsl:param name="number"/>
        <xsl:param name="nodes"/>
      <xsl:choose>
        <xsl:when test="$nodes">
          <xsl:variable name="recursive_result">
            ...
           <xsl:call-template name="addGerNumbers">
             ...
            </xsl:call-template>
            </xsl:variable>
          <xsl:value-of select="$number + $recursive_result"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="0"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:template>

最后,我需要一个值作为结果。

如何在 XSL for-each 循环中对所有先前的节点进行 XPath sum()?对我不起作用,因为我最后需要一个数字。

4

3 回答 3

2

一个 XPath 2.0 表达式就足够了:

<xsl:value-of select="sum( for $i in //numberGer return number(translate( $i, ',','.') ) )"/>

循环将for翻译每个值以用点替换逗号,然后将它们转换为数字。它返回一个数字序列,您现在可以正常求和。

于 2012-06-08T10:03:16.313 回答
1

可能是最短/最简单和最精确的 XPath 2.0 单线

sum(/*/*/numberGer/xs:decimal(translate(., ',', '.')))
于 2012-06-08T11:57:51.113 回答
1

如果您使用的是 XSLT 2.0,那么sum()可以很容易地将其应用于您的输入 XML。例如:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
    <xsl:output indent="yes"/>
    <xsl:template match="/">
        <xsl:variable name="numbers" as="xs:double*">
            <xsl:for-each select="example/data/numberGer">
                <xsl:sequence select="number(translate(., ',', '.'))"/>
            </xsl:for-each>
        </xsl:variable>
        <result>
            <xsl:value-of select="sum($numbers)"/>
        </result>
    </xsl:template>
</xsl:stylesheet>

XSLT 产生:

<?xml version="1.0" encoding="UTF-8"?>
<result>28.2</result>
于 2012-06-08T10:09:49.870 回答