XSLT 1.0从多个节点一起添加值

时间:2012-09-04 19:45:07

标签: xslt xslt-1.0

说我有以下XML

    <A>100</A>
    <B>200</B>
    <C>300</C>

以及以下XSLT

  <TEST>
    <xsl:value-of select="A + B + C"/>
  </TEST>

它产生以下输出

<TEST>600</TEST>

但是,当其中一个节点为空时

    <A></A>
    <B>200</B>
    <C>300</C>

我得到以下内容。

<TEST>NaN</TEST>

我只想添加有效数字的节点。如果xsl允许我通过添加到已经存在的变量来动态替换变量值,我可以这样做,但即使这样也会很麻烦。我认为有一种简单的方法可以让我失踪?

我只想要XSLT 1.0答案。

谢谢!

4 个答案:

答案 0 :(得分:7)

  <TEST>
    <xsl:value-of select="sum((A | B | C)[number(.) = .])"/>
  </TEST>

即,对元素A,B,C的子集求和,其内容可以用作数字。

请注意,number('')会产生NaN(NaN = NaN)为false,因此不会包含没有文字内容的元素。

我们测试了https://stackoverflow.com/a/3854389/423105

中讨论的数字

答案 1 :(得分:4)

LarsH答案的一点变化

sum((A|B|C)[number(.) = number(.)])

谓词中的表达式不会在XPath 2.0中导致任何类型错误,因为=的两个参数都是相同的类型 - xs:double。

答案 2 :(得分:2)

<xsl:value-of select="sum(/root/*[self::A or self::B or self::C][.!=''])"/>

这将在“Root”元素下添加A,B和C中的值,只要该值不为空。

答案 3 :(得分:2)

还有:

对于XSLT 1.0:

sum((A|B|C)[string(number())!='NaN'])

对于XSLT 2.0:

sum((A,B,C)[string(number())!='NaN'])

为了兴趣,这是另一个。它适用于XSLT 1.0和2.0

sum((A|B|C)[number()>-99999999])

在上面,将-99999999替换为小于可能值下限的一个。这是因为NaN> any-thing总是返回false。这可能是迄今为止最有效的解决方案,但可能会被视为有点难看。

例如,如果你知道A,B或C都不是负值的事实,你可以把:

sum((A|B|C)[number()>0])

......看起来更干净,仍然可以安静阅读。