2

我有以下 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.######"),".",",")' />

当我所有的项目都有价值时,总和很好。但是,如果其中之一为 null ( <CH4 xsi:nil="true"/>),则我的总和变为NaN.

到目前为止,我尝试添加一个新功能。但我们使用的 pdf 生成器不支持它。(System.Xml.Xsl.XslLoadException: 'xsl:function' 仍未实现

我尝试添加一个 C# 函数以添加为XsltArgumentList。一个简单return value ?? 0;但我也得到一个异常:_System.Xml.Xsl.XslTransformException:具有 Clr 'Nullable`1' 类型的扩展函数的参数或值不受管理_

现在我正在尝试使用 a xsl:variable,但我没有找到他们为变量添加值的示例(变量是静态的吗?)

那么,有什么建议吗?

4

3 回答 3

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。)

于 2013-06-20T20:23:36.457 回答
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)"/>
于 2013-06-20T17:11:01.813 回答
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;
    }

哪个有效。

于 2013-06-20T18:39:13.740 回答