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

标签 xml xslt sum

我正在尝试计算数字节点的总和。以下代码不返回除 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>

最佳答案

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

<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>

关于xml - 如何在 XSLT 中获取节点值的 sum(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29832511/

相关文章:

javascript - 为什么在 JavaScript 中读取 XML 文件时得到空结果?

xml - XSLT 1.0 - 获取两个单独的节点/@值以显示在表中

.net - XslCompiledTransform.Transform 64 位内存问题

javascript - 使用 XSL 将 XML 属性作为 id 传递到 HTML

使用C代码计算库仑定律

mysql - 从关于分组的前一行中减去一个值

java - 如何将 XML 文件转换为 json

java - 如何以编程方式在 Android 上加载 animator xml 文件?

iOS计算文件大小总和总是负数

xml - 如何在 Scala XML 输出中生成整数文字作为属性?