2009-02-17 85 views
1

我被一个似乎很愚蠢的问题困住了,但是我找不到解决方案......用XLST,我需要总结一个由模板计算出来的值列表。所以我将这些值存储在一个树形结构中(根元素“Numbers”中包含的“Number”元素列表)。但无论我试图用这个自制的清单,它会返回任何东西,0或错误...XSLT:树片段的总和将总是返回0!

有人知道我在做什么错了吗?

<!-- create the tree fragment --> 
<xsl:variable name="_subTotals"> 
    <Numbers> 
     <xsl:for-each select="List"> 
      <xsl:variable name="_Size"> 
       <xsl:call-template name="GetSize"> 
        <xsl:with-param name="_value" select="@value"/> 
       </xsl:call-template> 
      </xsl:variable> 
      <Number> 
       <xsl:value-of select="$_Size"/> 
      </Number> 
     </xsl:for-each> 
    </Numbers> 
</xsl:variable> 

<!-- this returns an error: expression must result into a node-set --> 
<xsl:message terminate="no"> 
    <xsl:value-of select="sum($_subTotals/Numbers/Number)"/> 
</xsl:message> 

<!-- transform the tree fragment into a node-set 
<xsl:variable name="_Total" select="msxsl:node-set($_subTotals)"/> 

<!-- returns nothing --> 
<xsl:for-each select="$_Total/Numbers/Number"> 
    <xsl:message terminate="no"> 
     <xsl:value-of select="@value"/> 
    </xsl:message> 
</xsl:for-each> 

<!-- returns 0 --> 
<xsl:value-of select="sum($_Total/Numbers/Number)"/> 

回答

0

以下是如何总结动态生成的值的快速方法(可能是您调用的模板未产生预期结果?如果是这样,您必须提出另一个问题并提供代码和XML文档。其中码操作没有这些没有一个可以帮助和猜测是没有用的):

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common" 
> 
<xsl:output method="text"/> 

    <xsl:template match="/"> 
     <xsl:variable name="vrtfNums"> 
     <nums> 
      <num>1</num> 
      <num>2</num> 
     </nums> 
     </xsl:variable> 

     <xsl:variable name="vNums" select="ext:node-set($vrtfNums)"/> 

     <xsl:value-of select="sum($vNums/*/*)"/> 
    </xsl:template> 
</xsl:stylesheet> 

当上述变换上任何XML文档(忽略)施加时,所需的结果是产生

3 
0

非常感谢Dimitre!这正是解决我的问题的地方:我在sum函数中使用的X-Path表达式。

但是为什么这工作:

<xsl:value-of select="sum($vNums/*/*)"/> 

,而不是说:

<xsl:value-of select="sum($vNums/nums/num)"/> 

0

递归是函数式语言中的常见答案。喜欢的东西:

<xsl:template name='totalRest> 
    <xsl:variable nane='sub'> 
    <!-- Use for-each to set local new context node --> 
    <xsl:for-each select='following::List[1]'> 
     <xsl:call-template name='totalRest'/> 
    </xsl:for-each> 
    </xsl:variable> 
    <xsl:variable name='this'> 
    <xsl:call-template name="GetSize"> 
     <xsl:with-param name="_value" select="@value"/> 
    </xsl:call-template> 
    </xsl:variable> 

    <xsl:value-of select='$sub+$this' /> 

</xsl:template> 

不知道更多的getSize和输入文档的,很难具体谈谈正确的XPath设置上下文节点的递归调用。

+0

对不起,不是非常具体,但我试图简化这个问题。实际上,我使用List元素的一个属性作为ID来获取输入文档中其他属性值,这些属性值是模板GetSize的参数(有3个)。 – Julien 2009-02-17 15:16:14