2012-09-11 42 views
2

我的XML看起來是這樣的:XSLT變量不工作

<units> 
    <unit> 
     <unitnum></unitnum> 
     <Year></Year> 
     <Qty></Qty> 
    </unit> 
</units> 

我創建一個密鑰來捕獲所有可能的歲月。像這樣:

<xsl:key name="yr" match="//Year/text()" use="." /> 

然後我爲每個循環通過鍵來獲得獨特的歲月。我的最終目標是要總結的分位數是這樣的:

<xsl:for-each select="//Year/text()[generate-id()=generate-id(key('yr',.)[1])]"> 
    <li> 
     <xsl:variable name="varjobyear" select="."/> 
     <xsl:value-of select="$varjobyear"/> - sum - 
     <xsl:value-of select="sum(//unit[Year=$varjobyear]/Qty)"/> 
    </li> 
</xsl:for-each> 

出於某種原因,我的輸出是這樣的:

2010 - sum - 0 
2011 - sum - 0 
2012 - sum - 0 

但我要的是那些0的是量的實際總和每年。

我最好的猜測是謂詞[年= $ varjobyear]有問題,但我無法弄清楚它是什麼。我也試過[Year = string($ varjobyear)]和[Year = number($ varjobyear)]。

我在做什麼錯?謝謝!

+0

請勿在匹配條件中使用//。這不是必需的。 –

回答

1

你想是這樣的

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kYearByVal" match="Year" use="."/> 

<xsl:template match="Year[generate-id()=generate-id(key('kYearByVal',.)[1])]"> 
    <li> 
    <xsl:value-of select="concat(., ' - sum - ', sum(key('kYearByVal',.)/../Qty))"/> 
    </li> 
</xsl:template> 

<xsl:template match="text()"/> 
</xsl:stylesheet> 

當下面的XML文檔應用這種轉變:

<units> 
    <unit> 
     <unitnum>12</unitnum> 
     <Year>1922</Year> 
     <Qty>3</Qty> 
    </unit> 
    <unit> 
     <unitnum>13</unitnum> 
     <Year>1922</Year> 
     <Qty>8</Qty> 
    </unit> 
    <unit> 
     <unitnum>14</unitnum> 
     <Year>1999</Year> 
     <Qty>5</Qty> 
    </unit> 
    <unit> 
     <unitnum>15</unitnum> 
     <Year>1999</Year> 
     <Qty>7</Qty> 
    </unit> 
    <unit> 
     <unitnum>16</unitnum> 
     <Year>2003</Year> 
     <Qty>3</Qty> 
    </unit> 
</units> 

想要的,正確的結果產生:

<li>1922 - sum - 11</li> 
<li>1999 - sum - 12</li> 
<li>2003 - sum - 3</li>