XSLT:处理使用指数表示法的数值

XSLT:处理使用指数表示法的数值,xslt,parsing,numbers,Xslt,Parsing,Numbers,我们必须转换一些包含指数(又称科学)符号数字的XML 例如 12.34e12 -12.34e-12 令人恼火的是,我们不能使用sum()函数之类的函数,因为XSLT解析器希望数字采用十进制格式 [我们使用.Net XslCompiledTransform类进行转换,但我认为这个问题在所有XSLT实现中都很常见] 到目前为止,这个问题的唯一解决方案是使用javascript函数(见下文)将字符串值转换为数字,然后编写我们自己的sum模板来调用这个函数 在我看来,一定有更好的办法,是吗 /* Th

我们必须转换一些包含指数(又称科学)符号数字的XML 例如

12.34e12 -12.34e-12 令人恼火的是,我们不能使用sum()函数之类的函数,因为XSLT解析器希望数字采用十进制格式

[我们使用.Net XslCompiledTransform类进行转换,但我认为这个问题在所有XSLT实现中都很常见]

到目前为止,这个问题的唯一解决方案是使用javascript函数(见下文)将字符串值转换为数字,然后编写我们自己的sum模板来调用这个函数

在我看来,一定有更好的办法,是吗

/* This function attempts to coerce the input into a number. */ function toNumber( x ) { if(!x) { return Number.NaN; } if(typeof x === 'number') { return x; } return parseFloat(x); }; /* 此函数尝试将输入强制为数字。 */ 函数编号(x){ 如果(!x){ 返回编号.NaN; } 如果(x的类型=='number'){ 返回x; } 返回浮点数(x); }; 这里很好用。输出0

编辑:现在我看到Saxon6(仅用于XSLT1.0的处理器)返回NaN。但是如果您尝试XSLT2.0,您将永远不需要其他任何东西。:-)

XML:


12.34e12
-12.34e12
XSLT:



感谢您的回复。不幸的是,我一直使用.Net转换类,据我所知,它们是XSLT1.0:-(虽然我只使用了Java版本,但Saxon应该在.net上运行。 /* This function attempts to coerce the input into a number. */ function toNumber( x ) { if(!x) { return Number.NaN; } if(typeof x === 'number') { return x; } return parseFloat(x); };
<?xml version="1.0" encoding="UTF-8"?>
<root>
    <Value>12.34e12</Value>
    <Value>-12.34e12</Value>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="root">
    <xsl:value-of select="sum(Value)"/>
</xsl:template>
</xsl:stylesheet>