我有以下XML结构:
<example>
<data>
<numberGer>3,40</numberGer>
</data>
<data>
<numberGer>7,40</numberGer>
</data>
<data>
<numberGer>17,40</numberGer>
</data>
</example>
我需要所有&#34; numberGer&#34;的总和。节点。数字的格式是一个问题。因为使用&#34;,&#34;功能&#34;总和&#34;产生错误。所以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>
最后我需要一个值。
How to XPath sum() all previous nodes in a XSL for-each loop?对我不起作用,因为我最后需要一个数字。
答案 0 :(得分:2)
单个XPath 2.0表达式就足够了:
<xsl:value-of select="sum( for $i in //numberGer return number(translate( $i, ',','.') ) )"/>
for
循环将翻译每个值以用点替换逗号,然后将它们转换为数字。它返回一个数字序列,您现在可以正常求和。
答案 1 :(得分: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>
答案 2 :(得分:1)
可能是最短/最简单,最精确的XPath 2.0单行:
sum(/*/*/numberGer/xs:decimal(translate(., ',', '.')))