2010-08-02 139 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>