如何找到3个数字中最大的2个数字,并对它们执行一些算术运算,如下例所示?
<root>
<num>10</num>
<num>12</num>
<num>8</num>
</root>
对于上面的输入,xslt代码应显示“10 + 12 = 22”和“average = 11”。
答案 0 :(得分:15)
此样式表:
<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
答案 1 :(得分:10)
<强>予。 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>