我有以下XSL:
<xsl:value-of select='translate(format-number(
Gaz/Baf/CH4
+ Gaz/Std/CH4
+ Gaz/Bsa/CH4
+ Gaz/Bbs/CH4
+ Gaz/Bhf/CH4
+ Gaz/Bin/CH4
, "### ### ### ##0.######"),".",",")' />
当我的所有物品都有值时,总和很好地相加。但是,如果其中一个为空(<CH4 xsi:nil="true"/>
),则我的总和变为NaN
。
到目前为止,我尝试添加一个新功能。但我们使用的pdf生成器不支持它。 ( System.Xml.Xsl.XslLoadException:'xsl:function'仍未实现)
我尝试添加一个C#函数作为 XsltArgumentList 添加。一个简单的return value ?? 0;
但我也得到一个异常:_System.Xml.Xsl.XslTransformException:没有管理具有Clr'Nullable`1'类型的扩展函数的参数或值_
现在我正在尝试使用xsl:variable
,但我找不到他们为变量添加值的示例(一旦定义了变量静态吗?)
那么,有什么建议吗?
答案 0 :(得分:5)
我告诉我的学生使用谓词来过滤掉那些不是数字的成员。
因此,在XSLT 1中,我将使用以下内容,依据NaN!=NaN
:
<xsl:value-of select='translate(format-number(
sum( ( Gaz/Baf/CH4
| Gaz/Std/CH4
| Gaz/Bsa/CH4
| Gaz/Bbs/CH4
| Gaz/Bhf/CH4
| Gaz/Bin/CH4 )[number(.)=number(.)] )
, "### ### ### ##0.######"),".",",")' />
在XSLT 2中,它会更优雅:
<xsl:value-of select='translate(format-number(
sum( (Gaz/Baf/CH4
| Gaz/Std/CH4
| Gaz/Bsa/CH4
| Gaz/Bbs/CH4
| Gaz/Bhf/CH4
| Gaz/Bin/CH4 )[. castable as xs:double] )
, "### ### ### ##0.######"),".",",")' />
(根据LarsH的观察修复;谢谢Lars。)
答案 1 :(得分:2)
您可以使用节点集的sum
。喜欢这个
<xsl:value-of select="translate(format-number(
sum(Gaz/Baf/CH4|Gaz/Std/CH4|Gaz/Bsa/CH4|Gaz/Bbs/CH4|Gaz/Bhf/CH4|Gaz/Bin/CH4),
'### ### ### ##0.######'), '.', ',')" />
<强>更新强>
你也许可以试试
<xsl:variable name="ch4" select="Gaz/Baf/CH4|Gaz/Std/CH4|Gaz/Bsa/CH4|Gaz/Bbs/CH4|Gaz/Bhf/CH4|Gaz/Bin/CH4"/>
然后变量$ch4
将包含一组与该表达式匹配的节点。您可以使用
<xsl:value-of select="count($ch4)"/>
你应该能够使用
计算总和<xsl:value-of select="sum($ch4)"/>
答案 2 :(得分:0)
我找到了一个使用C#
的工作解决方案我的第一次尝试是:
public decimal AddNaN(decimal? val)
{
return val ?? 0;
}
但它不喜欢decimal?
所以我尝试了别的东西:
public decimal AddNaN(string val)
{
decimal num = 0;
decimal.TryParse(val, out num);
return num;
}
哪个有用。