我想使用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)