说我有以下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答案。
谢谢!
答案 0 :(得分:7)
<TEST>
<xsl:value-of select="sum((A | B | C)[number(.) = .])"/>
</TEST>
即,对元素A,B,C的子集求和,其内容可以用作数字。
请注意,number('')
会产生NaN
,(NaN = NaN)
为false,因此不会包含没有文字内容的元素。
答案 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])
......看起来更干净,仍然可以安静阅读。