在xslt中添加两个值,有时可以为null

时间:2014-02-04 09:34:04

标签: xml xslt xslt-1.0

我想使用xslt添加从xml到另一个的值。我使用的是xml版本1。

<xsl:value-of select="number(/fields/field[@name='value1'])+number(/fields/field[@name='value2'])"/>

如果value1或value2有时会为空且生成NaN?

,我怎么能这样做呢?

我知道我可以使用if和when来查看value1或value2是否为空,但我要说我无法检查。我怎么能解决这个问题?

我想做的是,如果“number(/ fields / field [@ name ='value2'])”会产生一个NaN,那么它应该是0,那么它就可以工作。

祝你好运 乔

4 个答案:

答案 0 :(得分:5)

  

如果“number(/ fields / field [@ name ='value2'])”将生成一个NaN   应该是数字0

您可以尝试这样的事情:

<xsl:decimal-format name="coerce" NaN="0" />
...
<xsl:variable name="a" select="format-number(/fields/field[@name='value1'], '#', 'coerce')"/>
<xsl:variable name="b" select="format-number(/fields/field[@name='value2'], '#', 'coerce')"/>
...
<xsl:value-of select="$a + $b"/>

注意:示例中使用的格式采用整数输入。

答案 1 :(得分:2)

@ michael.hor257k已经提供了正确的解决方案 - 请接受他的答案。这只是为了说明该方法。

正如您所看到的,使用format-number可以达到与普通xsl:choose相同的效果,以确定field的内容是否为数字(看来您已明确决定)反对使用xsl:choose)。

输入XML

<?xml version="1.0" encoding="utf-8"?>
<fields>
   <pair>
      <field name="value1">2</field>
      <field name="value2">3</field>
   </pair>
   <pair>
      <!--number as strings-->
      <field name="value1">"2"</field>
      <field name="value2">"3"</field>
   </pair>
   <pair>
      <!--empty-->
      <field name="value1"/>
      <field name="value2"/>
   </pair>
</fields>

<强>样式表

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="/fields">
      <xsl:for-each select="pair">
         <xsl:variable name="summands">
            <xsl:for-each select="field">
               <field>
                  <xsl:choose>
                     <xsl:when test="number(.) != .">0</xsl:when>
                     <xsl:otherwise>
                        <xsl:value-of select="."/>
                     </xsl:otherwise>
                  </xsl:choose>
               </field>
            </xsl:for-each>
         </xsl:variable>
         <result-a>
            <xsl:value-of select="sum($summands/field)"/>
         </result-a>
      </xsl:for-each>
      <xsl:apply-templates select="//pair" mode="b"/>
   </xsl:template>

   <xsl:decimal-format name="coerce" NaN="0" />

   <xsl:template match="pair" mode="b">
      <xsl:variable name="a" select="format-number(field[1], '#', 'coerce')"/>
      <xsl:variable name="b" select="format-number(field[2], '#', 'coerce')"/>
      <result-b>
         <xsl:value-of select="$a + $b"/>
      </result-b>
   </xsl:template>

</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<result-a>5</result-a>
<result-a>0</result-a>
<result-a>0</result-a>
<result-b>5</result-b>
<result-b>0</result-b>
<result-b>0</result-b>

答案 2 :(得分:0)

我发现这适用于特殊情况,您可以确定每个节点都包含有效数字或节点将丢失。

<xsl:value-of select="sum(/fields/field[@name='value1'] | /fields/field[@name='value2'])"/>

这通过合并两个字段来创建节点集,然后对节点集中的节点求和。如果缺少某个节点,它将从节点集中省略,并且不会导致NaN。如果缺少所有节点,它将返回0

限制是存在但空节点将导致NaN,包含文本的节点也是如此。

答案 3 :(得分:-1)

您可以尝试使用xpath     布尔(数(//数量1)) 如果值是数字,则返回true。 你可以创建一个存储值转换器的变量或0(如果是NAN),然后得到总和(我的英语很不错)