我正在尝试编写XSL(1.0)以递归方式从节点添加值。我已经google了,只要节点是父/子,似乎有添加功能。我的节点远远超过了它。例如,我有:
<Document>
<Finance>
<Account>
<Type>Expense</Expense>
<Amount>25</Amount>
</Account>
</Finance
</Document>
<Document>
<Finance>
<Account>
<Type>Capital</Type>
<Amount>75</Amount>
</Account>
</Finance
</Document>
<Document>
<Finance>
<Account>
<Type>Expense</Type>
<Amount>50</Amount>
</Account>
</Finance
</Document>
我需要通过添加所有这些金额来获得总计为150的变量或其他内容。 注意。这不是确切的结构,但我简化了它。每个文档的节点都相同。 我一直在寻找一种基本上做的方式: I = 0 然后循环加起来i = i + 1
看起来这应该很容易。
我甚至想过也许能够for-each并创建一个只有两列的表然后使用它来加起来但我找不到方法。所以我正在寻找账户类型和总运行金额: 费用= 75 资本= 75
答案 0 :(得分:1)
如果类别(费用,资本)是不变的并且事先已知,您可以依次对每个类别求和。这是一个简单的例子:
<强> XML 强>
<root>
<Document>
<Finance>
<Account>
<Type>Expense</Type>
<Amount>25</Amount>
</Account>
</Finance>
</Document>
<Document>
<Finance>
<Account>
<Type>Capital</Type>
<Amount>100</Amount>
</Account>
</Finance>
</Document>
<Document>
<Finance>
<Account>
<Type>Expense</Type>
<Amount>50</Amount>
</Account>
</Finance>
</Document>
</root>
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" version="1.0" encoding="utf-8" indent="yes"/>
<xsl:key name="tx-by-type" match="Account" use="Type" />
<xsl:template match="/root">
<table border="1">
<tr>
<th>Expense</th>
<th>Capital</th>
<th>Total</th>
</tr>
<tr>
<xsl:variable name="total-expense" select="sum(key('tx-by-type', 'Expense')/Amount)" />
<xsl:variable name="total-capital" select="sum(key('tx-by-type', 'Capital')/Amount)" />
<td>
<xsl:value-of select="$total-expense" />
</td>
<td>
<xsl:value-of select="$total-capital" />
</td>
<td>
<xsl:value-of select="$total-expense + $total-capital" />
</td>
</tr>
</table>
</xsl:template>
</xsl:stylesheet>
<强>结果强>
<table border="1">
<tr>
<th>Expense</th>
<th>Capital</th>
<th>Total</th>
</tr>
<tr>
<td>75</td>
<td>100</td>
<td>175</td>
</tr>
</table>