2010-08-02 181 views
8

如何從3個數字中找出最大的2個數字並對它們執行一些算術運算(如下例所示)?XSLT中的算術運算

<root> 
    <num>10</num> 
    <num>12</num> 
    <num>8</num> 
</root> 

對於上述輸入,xslt代碼應該顯示「10 + 12 = 22」和「average = 11」。

+1

這聽起來像是作業。所以人們往往忽略「給我答案」類型的問題。你有什麼嘗試?顯示你做了什麼,什麼不工作。 – 2010-08-02 15:36:13

+0

@Jim Garrisson:我不知道如何在xslt中進行算術運算! 這不是我的家庭作品。 – brainless 2010-08-02 15:39:34

+1

@Jim Garrisson:我的問題要大得多。例如,我只給出了一小段代碼。我不是學校的孩子! – brainless 2010-08-02 15:43:09

回答

14

該樣式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 
    <xsl:template match="/root"> 
     <xsl:variable name="max1" select="num[not(../num > .)]"/> 
     <xsl:variable name="max2" select="num[not(../num[count(.|$max1)!=1] > .)]"/> 
     <xsl:value-of select="concat($max1,' + ', 
            $max2,' = ', 
            $max1 + $max2,'&#xA;', 
            'average = ', 
            ($max1 + $max2) div 2,'&#xA;')"/> 
    </xsl:template> 
</xsl:stylesheet> 

輸出:

12 + 10 = 22 
average = 11 
9

I. XSLT 1.0溶液

這種變換查找之和的所有數字的平均除了那些具有最小值 - 適用於任意長度的數字節點集:

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

<xsl:variable name="vMin"> 
    <xsl:for-each select="/*/num"> 
    <xsl:sort data-type="number"/> 
    <xsl:if test="position()=1"> 
    <xsl:value-of select="."/> 
    </xsl:if> 
    </xsl:for-each> 
</xsl:variable> 

<xsl:variable name="vNumsWithoutMin" select="/*/num[not(.=$vMin)]"/> 

<xsl:variable name="vSumWithoutMin" select="sum($vNumsWithoutMin)"/> 

<xsl:template match="/*"> 
    <xsl:apply-templates select="$vNumsWithoutMin"/> 
    <xsl:value-of select="concat(' = ', $vSumWithoutMin)"/> 
    average = <xsl:value-of select= 
    "$vSumWithoutMin div count($vNumsWithoutMin)"/> 
</xsl:template> 

<xsl:template match="num"> 
    <xsl:value-of select="."/> 
    <xsl:if test="not(position()=last())"> 
    <xsl:text> + </xsl:text> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

當此所提供的XML文檔施加:

<root> 
    <num>10</num> 
    <num>12</num> 
    <num>8</num> 
</root> 

有用,正確的結果產生

10 + 12 = 22 
average = 11 

II。 XSLT 2.0解決方案

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output method="text"/> 

<xsl:variable name="vMin" select="min(/*/num/number(.))"/> 

<xsl:variable name="vNumsSansMin" 
    select="/*/num[not(number() eq $vMin)]/number(.)"/> 
<xsl:variable name="vAvgSansMin" 
     select="avg($vNumsSansMin)"/> 

<xsl:template match="/*"> 
    <xsl:sequence select= 
    "(for $i in 1 to count($vNumsSansMin) 
     return 
     ($vNumsSansMin[$i], 
      if(not($i eq count($vNumsSansMin))) 
      then ' + ' 
      else() 
     ) 
    ), 
     ' = ', sum($vNumsSansMin) 
    "/> 

    average = <xsl:sequence select="$vAvgSansMin"/> 
</xsl:template> 
</xsl:stylesheet>