在XSLT中添加两个值,有时可能为null



我想使用XSLT添加从XML到另一个值的值。我正在使用XML版本1。

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

,如果Value1或Value2有时会为空并且会产生和NAN?

我该怎么办?

我知道我可以使用以及何时查看value1或value2是否不是空,但假设我无法检查。我该如何解决?

我想做的是" number(/fields/field [@name ='value2'])"将产生一个nan,这应该是数字0,然后它将起作用。

最好的问候乔

如果" 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"/>

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

@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>

我发现这适用于特殊情况,在这种情况下,您确定每个节点都会包含一个有效的数字,否则节点将丢失。

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

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

限制是存在的,但是空节点将引起NaN,包含文本的节点也会引起。

您可以尝试XPATH 布尔值(数字(//编号1))如果值为数字,则返回true。您可以创建一个存储值转换器的变量或0(如果是nan),然后进行总和(我的英语sotty)

相关内容

  • 没有找到相关文章

最新更新