XSLT:XPATH运算符“小于或等于”计算不正确

时间:2016-10-05 09:24:24

标签: xml xslt xpath

我正在使用以下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 &lt;= $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 &lt;= $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>

2 个答案:

答案 0 :(得分:0)

使用XSLT 2.0(和XPath 2.0),比较运算符<<=等的效果取决于操作数的数据类型。

假设您的样式表不能识别模式,比较两个属性(如@month &lt; $other/@month)是两个untypedAtomic值之间的比较,并将它们作为字符串进行比较:so&#34; 10&#34 ; &LT; &#34; 2&#34 ;.要进行数字比较,请将其中一个或两个值转换为数字:xs:integer(@month) &lt; xs:integer($other/@month),或简洁+@month &lt; +$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) &lt;= xs:integer($vCURRENTMONTH)]/@sum) *100) div 100"/>
</xsl:for-each-group>

这会为@chartmonth的所有值生成正确的结果。

谢谢!