我想使用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,那么它就可以工作。
祝你好运 乔
答案 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),然后得到总和(我的英语很不错)