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