XML递归添加超出父节点

时间:2015-11-20 02:45:51

标签: xml xslt-1.0 xsl-fo

我正在尝试编写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

1 个答案:

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

enter image description here