XSLT值的总和基于两个不同表中的数据

时间:2009-07-21 15:40:55

标签: xslt

XML:

<Budget>
    <Table1>
        <AllocID>1</AllocID>
        <Amount>1000</Amount>
    </Table1>
    <Table1>
        <AllocID>2</AllocID>
        <Amount>2000</Amount>
    </Table1>
    <Table1>
        <AllocID>3</AllocID>
        <Amount>3000</Amount>
    </Table1>
    <Table2>
        <AllocID>1</AllocID>
        <Split>100</Split>
    </Table2>
    <Table2>
        <AllocID>2</AllocID>
        <Split>100</Split>
    </Table2>
</Budget>

我在表中显示金额,但仅当表2中存在“拆分”值时。

<xsl:for-each select="Budget/Table1">
    <xsl:for-each select="//Budget/Table2[AllocID = current()/AllocID]">
        <xsl:value-of select="Amount"/>
    </xsl:for-each>
</xsl:for-each>
//Total for the records here.

我需要从Table1中获取Amounts的总和,但前提是Table2中存在AllocID的值。所以在这个例子中,我只想要AllocIDs 1和A的数量之和。 2.如何在不修改给定数据集的情况下在xslt中执行此操作?

1 个答案:

答案 0 :(得分:2)

对输入数据一无所知(我不知道为什么你选择不使用实际的XML ),我将不得不猜一点:

<Budget>
  <Table1>
    <AllocID>1000</AllocID>
    <AllocID>2000</AllocID>
    <AllocID>3000</AllocID>
  </Table1>
  <Table2>
    <AllocID>1000</AllocID>
    <AllocID>2000</AllocID>
  </Table2>
</Budget>

最简单的是XPath sum() function以及正确的XPath表达式:

<!-- this will return 3000 for the above input -->
<xsl:template match="/" >
  <xsl:value-of select="
    sum(Budget/Table1/AllocID[. = //Budget/Table2/AllocID])
  " />
</xsl:template>

运行总和也可以使用递归函数计算,如下所示:

<!-- this will also return 3000 for the above input -->
<xsl:template match="/" >
  <xsl:call-template name="total">
    <xsl:with-param name="nodes" select="
      Budget/Table1/AllocID[. = //Budget/Table2/AllocID]
    " />
  </xsl:call-template>
</xsl:template>

<xsl:template name="total">
  <xsl:param name="nodes" />

  <xsl:choose>
    <!-- either there is something to calculate... -->
    <xsl:when test="string(number($nodes[1])) != 'NaN'">
      <xsl:variable name="subtotal">
        <xsl:call-template name="total">
          <xsl:with-param name="nodes" select="$nodes[position() &gt; 1]" />
        </xsl:call-template>
      </xsl:variable>
      <xsl:value-of select="number($nodes[1]) + $subtotal" /> 
    </xsl:when>
    <!-- ...or we assume 0 -->
    <xsl:otherwise>
      <xsl:value-of select="0" /> 
    </xsl:otherwise>
  </xsl:choose>

</xsl:template>

速度较慢,但​​在计算过程中可以提供更大的灵活性。例如,您可以将所有非数字值替换为0。或者根据您自己的规则使用给定节点的不同值。