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中执行此操作?
答案 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() > 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。或者根据您自己的规则使用给定节点的不同值。