如何在XSLT中获取节点值的sum()

5
我正在尝试计算数值节点的总和。以下代码除了HTML之外没有返回任何内容。我知道sum()需要一个节点集。我认为我已经正确创建了变量。我在做什么错了。
谢谢。
XML示例:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<container xmlns="http://www.gtech.com/lsp/2009-09-23">
    <Root>
        <Incentives>
            <Date>2015-03-14</Date>
            <ID>507200</ID>
            <ProgramName>Retailer Cash Incentive 16</ProgramName>
            <Retailer>
                <ID>507201</ID>
                <Name>Acme #2102</Name>
                <Detail>
                    <CashPaymentsToday>50.00</CashPaymentsToday>
                    <Potential>0</Potential>
                </Detail>
            </Retailer>
            <Retailer>
                <ID>507202</ID>
                <Name>Acme #2103</Name>
                <Detail>
                    <CashPaymentsToday>60.00</CashPaymentsToday>
                    <Potential>0</Potential>
                </Detail>
            </Retailer>
            <Retailer>
                <ID>507203</ID>
                <Name>Acme #1008</Name>
                <Detail>
                    <CashPaymentsToday>0.00</CashPaymentsToday>
                    <Potential>0</Potential>
                </Detail>
            </Retailer>
            <Retailer>
                <ID>507207</ID>
                <Name>Acme #2228</Name>
                <Detail>
                    <CashPaymentsToday>200.00</CashPaymentsToday>
                    <Potential>3</Potential>
                </Detail>
            </Retailer>
            <Retailer>
                <ID>598419</ID>
                <Name>Acme NO 1071</Name>
                <Detail>
                    <CashPaymentsToday>NONQUAL</CashPaymentsToday>
                    <Potential>NONQUAL</Potential>
                </Detail>
            </Retailer>
            <Retailer>
                <ID>598421</ID>
                <Name>Acme NO 1072</Name>
                <Detail>
                    <CashPaymentsToday>NONQUAL</CashPaymentsToday>
                    <Potential>NONQUAL</Potential>
                </Detail>
            </Retailer>
        </Incentives>
    </Root>
</container>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
<html>
<body>
        <xsl:variable name="cashPayments">
            <xsl:for-each select="//Detail">
                <xsl:if test="CashPaymentsToday"/>
            </xsl:for-each>
        </xsl:variable>
        <xsl:value-of select="sum($cashPayments)"/>
</body>     
</html>
    </xsl:template>
</xsl:stylesheet>
1个回答

15

首先,您的输入文档包含默认命名空间:

<container xmlns="http://www.gtech.com/lsp/2009-09-23">

需要考虑的是,在引用输入文档时,必须重新在样式表中声明并给元素添加前缀。

此外,如果您只是想对节点进行求和,完全没有必要构建变量 - 但是一些CashPaymentsToday元素不包含数字:

<CashPaymentsToday>NONQUAL</CashPaymentsToday>

你需要从总和中排除那些元素。最后,你目前在XSLT 1.0中所做的是不可能的 - 因为sum()函数不能将所谓的结果树片段作为参数。你的方法不应该“仅返回html”,它实际上应该失败。 XSLT 样式表
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:gt="http://www.gtech.com/lsp/2009-09-23"
exclude-result-prefixes="gt">

    <xsl:template match="/">
    <html>
        <body>
            <xsl:value-of select="sum(//gt:CashPaymentsToday[. != 'NONQUAL'])"/>
        </body>     
    </html>
    </xsl:template>
</xsl:stylesheet>

HTML输出

<html>
   <body>310</body>
</html>

1
如果您可能获得除“NONQUAL”之外的其他非数字,则可以更通用,只需测试数值: <xsl:value-of select="sum(//gt:CashPaymentsToday[number(.) = .])"/>。有关此测试的更完整讨论,请参见https://dev59.com/y2865IYBdhLWcg3wW9RE - bjimba
@bjimba 是的,那是一个不错的方法 - 但它也更加难以理解。让我们等待原帖作者澄清是否确实有更多不是数字的值。 - Mathias Müller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接