如果某些可能为null,如何在XSL中对不同的字段求和?

时间:2013-06-20 16:53:03

标签: xslt null sum xsl-fo

我有以下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,但我找不到他们为变量添加值的示例(一旦定义了变量静态吗?)

那么,有什么建议吗?

3 个答案:

答案 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;
    }

哪个有用。