2009-02-17 56 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