Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 在节点集包含空值的XSLT中使用fn:sum_Xml_Xslt_Xpath - Fatal编程技术网

Xml 在节点集包含空值的XSLT中使用fn:sum

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/

我试图使用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/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>