Xml 在节点集包含空值的XSLT中使用fn:sum
我试图使用XSLT和XPath函数fn:sum在XML中汇总一组值。只要值不为null,这就可以正常工作,但情况并非如此。为了说明我的问题,我举了一个例子:Xml 在节点集包含空值的XSLT中使用fn:sum,xml,xslt,xpath,Xml,Xslt,Xpath,我试图使用XSLT和XPath函数fn:sum在XML中汇总一组值。只要值不为null,这就可以正常工作,但情况并非如此。为了说明我的问题,我举了一个例子: <?xml version="1.0"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/
<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:template match="/root">
<root>
<!-- Works fine for non-null values -->
<sum><xsl:value-of select="fn:sum(values/value)" /></sum>
</root>
</xsl:template>
</xsl:stylesheet>
以及XML:
<?xml version="1.0"?>
<root>
<values>
<value>1</value>
<value>2</value>
<value>3</value>
<value>4</value>
<!-- Nullvalue -->
<value />
</values>
</root>
1.
2.
3.
4.
只要没有空值,该示例就可以正常工作。我尝试了select的各种变体,例如
(您可能会注意到,XSLT导出不多;))如何过滤空值?显式测试节点是否具有内容:
<sum><xsl:value-of select="fn:sum(values/value[text()])" /></sum>
我认为你提到的:
<xsl:value-of select="fn:sum(values[value != '']/value)" />
不起作用,因为节点为空-它根本不包含文本节点,而
value!=''代码>测试空字符串-即,数据长度为0的文本节点。仅对包含数字的元素求和:
<sum>
<xsl:value-of select="fn:sum(values/value[number(.)=number(.)])" />
</sum>
对于空元素或字符串值不是数字的元素,的结果将是NaN
MSDN参考-
XML:
1.
7.
你好,世界
4.
XSLT:
请注意:在XSLT 2.0中,使用像“sum”这样的函数不需要使用像“fn”这样的前缀,请参见其中的说明:“默认函数名称空间是在[functions and Operators]中定义的标准函数名称空间。这意味着不必在样式表中声明此名称空间,也不必使用前缀fn(或任何其他前缀)在对核心函数的调用中。”
<?xml version="1.0"?>
<doc>
<num>1</num>
<num>7</num>
<notnum>hello world</notnum>
<num>4</num>
</doc>
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/Transform/1.0">
<xsl:template match="/">
<xsl:value-of select="sum(/doc/num)"/>
</xsl:template>
</xsl:stylesheet>