我正在尝试使用XSLT 1.0解析文档以插入数据库,我注意到一个问题,即任何时候我有一个%值,它将返回“NaN”而不是实际值。我找不到这个问题的任何地方
来源:
<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="NaNValues.xsl" ?>
<items>
<item>10%</item>
</items>
模板:
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output omit-xml-declaration="no" method="xml" indent="yes" version="1.0"/>
<xsl:template match="items">
<xsl:for-each select="item">
<xsl:call-template name="IsNaN"/>
</xsl:for-each>
</xsl:template>
<xsl:template name="IsNaN">
<MyItem>
<xsl:variable name="myItem" select="item" />
<xsl:value-of select="$myItem"/>
</MyItem>
</xsl:template>
</xsl:stylesheet>
输出:
<MyItem>NaN</MyItem>
我尝试了以下内容:
substring($myItem,1,2)
substring($myItem,1,3)
concat($myItem,'')
string($myItem)
我遇到的主要问题是如何处理输入文件中的百分比符号。
答案 0 :(得分:2)
我没看到这段代码如何产生NaN。它没有做任何算术,这是NaN总是来自的地方。当我运行它时,它产生了这个:
<?xml version="1.0" encoding="UTF-8"?>
<MyItem/>
请检查您是否正在运行您说正在运行的代码,如果它确实给了NaN,请告诉我们您如何运行它的详细信息(例如,哪个处理器以及如何调用)。
代码显然是无意义的 - 使用“item”元素作为上下文节点调用模板isNaN,并尝试查找名为“item”的上下文节点的子节点,当然也没有这样的子节点。但那不应该返回任何东西,而不是NaN。
答案 1 :(得分:1)
NaN永远不会与任何事物相提并论 - 甚至不是自己。因此,如果您有两个NaN值,它们将不相等。您可以通过对任何有效的xml文件运行这个小的xslt转换来检查这一点:
<xsl:template match="/">
<xsl:value-of select="'3%' = '3%'"/>|<xsl:value-of select="number('3%') = number('3%')"/>
</xsl:template>
结果是:
true|false
number('3%')试图将'3%'转换为无效且导致NaN的数字。所以在第二种情况下有效地使用NaN = NaN,你可以看到它是假的。
回到你的案例 - 这取决于你想用这个值做什么。如果您盲目地在任何数学运算(加法,乘法等)中使用它,xslt处理器将尝试将您的值转换为数字(由于%字符而为NaN)并且从此点开始任何数学运算的结果将是NaN(我们现在知道)不等于任何东西。 如果你想将值视为字符串,并且由于某种原因首先转换为数字而不是你想要的值,你可以通过执行字符串(项目)显式地转换它。最后,如果您只想检查值是否为有效数字,您可以使用上面的技巧并执行:
<xsl:value-of select="number($item) = $item"/>
如果值不可转换为数字,则数字($ item)返回NaN(我们知道,它不等于任何内容),表示该项目不是有效值。如果$ item可以转换为数字而不是'='的另一边将被隐式转换为数字,并且两者都应该具有相同的值,这将导致返回true
答案 2 :(得分:1)
显而易见的问题是,提供的代码使用当前节点item
:
<xsl:template name="IsNaN">
<MyItem>
<xsl:variable name="myItem" select="item" />
<xsl:value-of select="$myItem"/>
</MyItem>
</xsl:template>
这会尝试输出当前节点的第一个item
子的字符串值 - 但是在提供的XML文档中,item
没有{ {1}}孩子本身。
当然,这并不能解释为什么返回NaN - 任何兼容的XSLT处理器都必须生成空字符串。我相信您的实际代码与您向我们展示的代码不同,实际代码涉及算术运算。在这种情况下,表达式的求值会尝试将空字符串转换为数字 - 结果是NaN。
只需重写上述模板:
item