这是这个问题的扩展。
我有一个类似的XML片段
<lines>
<item><code>1.1</code><amt>1000.00</amt></item>
<item><code>1.3.1</code><amt>2000.00</amt></item>
<item><code>1.3.2</code><amt>3000.00</amt></item>
<item><code>2.1</code><amt>4000.00</amt></item>
...
</lines>
我想把一些预先定义好的代码加起来。多亏了一个建议,现在我可以这样做了:
<xsl:value-of select="sum(item[code=1.1 or code=1.2 or
code=1.3.1 or code=1.3.2]/amt)"/>
但我想创建一个模板,并用易读的params调用它,列出所有需要的代码。类似于:
... <xsl:with-param name="set" select="'1.1, 1.2'"/> ...
or
... <xsl:with-param name="set" select="'(1.1)|(1.2)'"/> ...
然后在调用的模板中执行类似的操作:
<xsl:value-of select="sum(item[code in $set]/amt)"/>
这在XSLT中可能吗?
附言:我使用的是SAP XSLT处理器,它受到了很大的限制,例如没有matches()。
<xsl:variable name="set"
select="'(1.1)(1.2)(2.1)'"/>
<xsl:template match="/">
<answer>
<xsl:call-template name="sum-it">
<xsl:with-param name="set" select="$set"/>
<xsl:with-param name="items" select="lines/item"/>
</xsl:call-template>
</answer>
</xsl:template>
<xsl:template name="sum-it">
<xsl:param name="set"/>
<xsl:param name="items"/>
<xsl:value-of select="sum(
$items[contains($set,concat('(', code ,')'))]/amt)"/>
</xsl:template>