我正在使用以下XSLT表达式
<xsl:for-each-group select="row" group-by="@month">
<xsl:sort select="@chartmonth" data-type="number" order="ascending"/>
<xsl:variable name="vCURRENTMONTH" select="@chartmonth"/>
<xsl:value-of select="round(sum([@chartmonth <= $vCURRENTMONTH]/@sum) *100) div 100"/>
</xsl:for-each-group>
计算每月的值。这样可以正常工作,但是,当@chartmonth等于10时,计算仅在第1个月和第10个月进行,即它将第1个月和第10个月的总和相加,但它会“忘记”,第2个月到第9个月。 当@chartmonth等于9(或任何其他数字)时,计算是正确的。
更奇怪的是,当我将代码更改为:
<xsl:for-each-group select="row" group-by="@month">
<xsl:sort select="@chartmonth" data-type="number" order="ascending"/>
<xsl:variable name="vCURRENTMONTH" select="@chartmonth"/>
<xsl:value-of select="round(sum([@chartmonth+0 <= $vCURRENTMONTH+0]/@sum) *100) div 100"/>
</xsl:for-each-group>
即使@chartmonth等于10,计算总是正确的。
有没有人知道我做错了什么或是什么导致了这个问题?
非常感谢,
编辑1: INPUT是:
<rows>
<row month="Jan" chartmonth="1" sum="394.66"/>
<row month="Feb" chartmonth="2" sum="435.37"/>
<row month="Mar" chartmonth="3" sum="424.42"/>
<row month="Apr" chartmonth="4" sum="376.73"/>
<row month="May" chartmonth="5" sum="418.18"/>
<row month="Jun" chartmonth="6" sum="404.54"/>
<row month="Jul" chartmonth="7" sum="466.78"/>
<row month="Aug" chartmonth="8" sum="475.36"/>
<row month="Sep" chartmonth="9" sum="502.21"/>
<row month="Oct" chartmonth="10" sum="46.82"/>
</rows>
答案 0 :(得分:0)
使用XSLT 2.0(和XPath 2.0),比较运算符<
,<=
等的效果取决于操作数的数据类型。
假设您的样式表不能识别模式,比较两个属性(如@month < $other/@month
)是两个untypedAtomic值之间的比较,并将它们作为字符串进行比较:so&#34; 10&#34 ; &LT; &#34; 2&#34 ;.要进行数字比较,请将其中一个或两个值转换为数字:xs:integer(@month) < xs:integer($other/@month)
,或简洁+@month < +$other/@month
(如果您的样式表是架构感知的,并且@month
在架构中使用数字类型声明,则比较将按照您的预期以数字方式完成。)
答案 1 :(得分:0)
这绝对解决了这个问题。
现在使用的代码是
<xsl:for-each-group select="rows" group-by="@month">
<xsl:sort select="@chartmonth" data-type="number" order="ascending"/>
<xsl:variable name="vCURRENTMONTH" select="@chartmonth"/>
<xsl:value-of select="round(sum([xs:integer(@chartmonth) <= xs:integer($vCURRENTMONTH)]/@sum) *100) div 100"/>
</xsl:for-each-group>
这会为@chartmonth的所有值生成正确的结果。
谢谢!