2013-06-02 131 views
2

我想計算取決於不同元素屬性的值,然後求和計算出的值。XSL如何計算根據元素屬性計算的元素值?

xml的構造是這樣的:

<elements> 
    <element type="type1"> 
     <value>10</value> 
     <date>01.05.2012</date> 
    </element> 

    <element type="type2"> 
     <value>20</value> 
     <date>02.03.2012</date> 
    </element> 

    <element type="type2"> 
     <value>20</value> 
     <date>02.03.2012</date> 
    </element> 

</elements> 

我在XSD用於xsd:alternatives創建元素的不同「類型」。

的XSL是這樣的:

<xsl:for-each select="/elements">   
    <xsl:sort select="date"/> 

    <xsl:choose> 
    <xsl:when test="type='type1'"> 
     <xsl:value-of select="value*20"/> 
     <xsl:value-of select="date"/> 
    </xsl:when> 

    <xsl:when test="type='type1'"> 
     <xsl:value-of select="value*10"/> 
     <xsl:value-of select="date"/> 
    </xsl:when> 
    </xsl:choose> 

    (Here should be a sum of all the values that have been calculated.)   
    </xsl:for-each> 

我希望能夠展現價值有人計算後,由不同的值進行排序(使用取決於「類型」這是一個因素。)他們的日期並顯示所有計算值的總和。

我確信有更好的方法來做我想做的事情,我對任何建議感到高興。

+0

什麼是倍增因子type1和TYPE2?你的例子顯示了對type1的測試和乘以不同的值。 –

回答

1

假設@type="type1" should be multiplied by 10 and @類型= 「2型」`應由20,下面的樣式表相乘:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" indent="yes"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="elements/element"> 
      <xsl:sort select="date" /> 
     </xsl:apply-templates> 
     <xsl:value-of select="'&#xA;'"/> 
     <xsl:value-of select="sum(*/element[@type='type1']/value 
             [number()=number()]) * 10 + 
           sum(*/element[@type='type2']/value 
             [number()=number()]) * 20"/> 
    </xsl:template> 

    <xsl:template match="element[@type='type1']/value"> 
     <xsl:value-of select=". * 10"/> 
    </xsl:template> 

    <xsl:template match="element[@type='type2']/value"> 
     <xsl:value-of select=". * 20"/> 
    </xsl:template> 

    <!-- this matches any of the value elements who's values are not a number --> 
    <xsl:template match="element[@type]/value[number()!=number()]"> 
     <xsl:text>0</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 

產生以下輸出:

100 
    01.05.2012 

    400 
    02.03.2012 

    400 
    02.03.2012 

900 
+0

非常感謝您的回答。 – Garil

+0

我仍然有空值生成NaN的問題。我該如何解決這個問題?我已經嘗試在每個sum中的xpath之後使用[number(。)= number(。)],但它不起作用。 – Garil

+0

我調整了答案以適應'value'元素的空值和非數值。你可以定義一個匹配這些'value'元素的模板併發出一個'0',並且總和中使用謂詞過濾器來排除這些'value'元素。 –