8
如何从3个数字中找出最大的2个数字并对它们执行一些算术运算(如下例所示)?XSLT中的算术运算
<root>
<num>10</num>
<num>12</num>
<num>8</num>
</root>
对于上述输入,xslt代码应该显示“10 + 12 = 22”和“average = 11”。
如何从3个数字中找出最大的2个数字并对它们执行一些算术运算(如下例所示)?XSLT中的算术运算
<root>
<num>10</num>
<num>12</num>
<num>8</num>
</root>
对于上述输入,xslt代码应该显示“10 + 12 = 22”和“average = 11”。
该样式表:
<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,'
',
'average = ',
($max1 + $max2) div 2,'
')"/>
</xsl:template>
</xsl:stylesheet>
输出:
12 + 10 = 22
average = 11
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>
这听起来像是作业。所以人们往往忽略“给我答案”类型的问题。你有什么尝试?显示你做了什么,什么不工作。 – 2010-08-02 15:36:13
@Jim Garrisson:我不知道如何在xslt中进行算术运算! 这不是我的家庭作品。 – brainless 2010-08-02 15:39:34
@Jim Garrisson:我的问题要大得多。例如,我只给出了一小段代码。我不是学校的孩子! – brainless 2010-08-02 15:43:09